用条件连接五张表的 SQL 查询

Posted

技术标签:

【中文标题】用条件连接五张表的 SQL 查询【英文标题】:SQL query for joining five tables with conditions 【发布时间】:2016-01-16 00:31:01 【问题描述】:

我有 5 个表格,如下所示:

Serial_Number|Product_ID|Mfg_ID|Distribution_Type
AG0026       | CKJUT    |UGXT03|A
BX3234       | NPLPT    |UXXP32|B
LP3269       | KNGTP    |AKML63|A
.....         .....      ...    ..

产品详情2:

Serial_Number|Product_Type|Unit
NG2164       |S           |10
LT4598       |L           |13
BX3234       |L           |21

制造商:

SLNO|Product_Code|Mfg_Code
1   |T03         |T03
2   |L63         |L63
3   |BXT         |null

制造细节1:

mfg_code|Mfg_Name
T03         | xy.pvt.ltd
L63         | LP.pvt.ltd

制造细节2:

Sel_ID|Mfg_Name
UXXP32|ab.pvt.ltd
NTLP25|cd.pvt.ltd

现在我需要在需要以下列的地方生成报告

    序列号 Product_ID 产品类型为 L 的 Mfd_ID Mfg_Name,其中产品类型为 L 产品类型为 L 的单位

条件:

    MfgDetails1 的 Product_code= ProductDetails1 的 Mfg_ID 的最后 3 位 MfgDetails2 的 Sel_ID= ProductDetails1 的 Mfg_ID 如果 distribution_type = 'A',则用于制造细节。您需要获取 ProductDetails1 的 mfg_ID 的最后 3 个字符,在 mfgacct 上将其作为 product_code 查找 mfg_code,然后使用该 mfg_code 访问 mfg_name 的 MfgDetails1。 如果 distribution_type = 'B',则获取制造商详细信息。您需要获取 ProductDetails1 的完整 mfg_ID,并将其作为 MfgDetails2 上的 Sel_ID 查找。

所以我的查询:

SELECT 
    pd1.serial_number AS 'Serial Number',Pd1.product_ID AS 'Product ID', 
    pd1.mfg_id,
    CASE WHEN pd1.distribution_type='A' THEN md1.Mfg_Name 
         ELSE md2.Mfg_Name 
    END AS 'MFG Name',
    pd1.distribution_type,
    pd2.unit
FROM   
    ProductDetails1 pd1 
JOIN 
    ProductDetails2 pd2 ON pd1.serial_number = pd2.serial_number 
JOIN   
    Mfgaccnt ON Mfgaccnt.Product_Code = Right(Pd1.Mfg_ID,3)
JOIN  
    MfgDetails1 ON Md1.Mfg_Code = Mfgaccnt.Product_Code
LEFT JOIN 
    MfgDetails2 md2 ON pd1.mfg_Id = md2.sel_ID
WHERE
    pd2.product_type = 'L'

但是 Result 没有返回任何 B 分布类型的产品。请帮帮我

【问题讨论】:

我无法格式化。请帮忙。 欢迎来到 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( ) 在编辑器工具栏上(或将行缩进至少 4 个字符!)以很好地格式化和语法突出显示它! 【参考方案1】:

这不是问题吗:

如果 distribution_type = 'A',则用于制造细节。你需要 取 ProductDetails1 的 mfg_ID 的最后 3 个字符,查一下 作为 mfgacct 上的 product_code 来查找 mfg_code,然后使用它 mfg_code 以访问 mfg_name 的 MfgDetails1。

在您的 SQL 中,您也在为其他分发类型执行此操作:

JOIN   
    Mfgaccnt ON Mfgaccnt.Product_Code = Right(Pd1.Mfg_ID,3)

由于这不是左外连接,它将过滤掉所有没有以这种方式匹配的行。

【讨论】:

以上是关于用条件连接五张表的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

怎样用Sql语句判断一张表中的两条数据相同

sql查询:使用内连接查询两张表的时候,如果左边表的一条记录对应了右边表的两条记录,结果显示排列问题

mysql啥时候使用子查询,啥时候使用表连接查询,关系多张表的时候该怎么查询

用于连接 5 个表的 SQL 查询 [重复]

数据库SQL Server2012笔记——多表查询子查询分页查询用查询结果创建新表和外连接

20161118学习笔记