用于连接具有条件的五个表的SQL查询

时间:2015-10-17 08:00:49

标签: sql-server sql-server-2008 join left-join inner-join

我有5个表如下:

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

ProductDetails2:

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

Mfgaccnt:

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

MfgDetails1:

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

MfgDetails2:

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

现在我需要生成一个报告,我需要关注列

  1. 序列号
  2. PRODUCT_ID
  3. 产品类型为L
  4. 的Mfd_ID
  5. 产品类型为L
  6. 的Mfg_Name
  7. 产品类型为L的单位
  8. 条件:

    1. MfgDetails1的Product_code = ProductDetails1的Mfg_ID的最后3位数
    2. MfgDetails2的Sel_ID = ProductDetails1的Mfg_ID
    3. 如果distribution_type ='A',则为mfg详细信息。您需要获取ProductDetails1的mfg_ID的最后3个字符,将其作为mfgacct上的product_code查找以找到mfg_code,然后使用该mfg_code访问mfg_name的MfgDetails1。
    4. 如果distribution_type ='B',则为mfg详细信息。您需要获取ProductDetails1的完整mfg_ID,并将其视为MfgDetails2上的Sel_ID。
    5. 所以我的查询:

      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'
      

      但结果并未返回任何B分销类型的产品。请帮帮我

1 个答案:

答案 0 :(得分:0)

这不是问题所在:

  • 如果distribution_type =' A',则为mfg详细信息。你需要 获取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)

由于那不是左外连接,它将过滤掉那些没有得到匹配的行。