IF关于Join或Where子句的条件条件

时间:2018-08-17 15:41:47

标签: sql sql-server-2014

我正在编写一个查询,该查询的左外部连接到一个表,该表包含一个要显示为列的ID号字段(STD_ID_NUM)。具有ID号字段的表具有键字段SETID,VENDOR_ID和VNDR_LOC。 BUSINESS_UNIT不是关键字段,但是在某些情况下,它是唯一将一行与另一行区分开的列。我最初是从PS_GH_VNDR_ACCT_ID的联接中包含业务单元的,但是由于“业务单元”字段是可选的,因此有些行没有为业务单元填充值,因此我的查询未返回STD_ID_NM。

如您所见,此表中“业务单位”不是必填字段。在某些情况下,例如第一个VENDOR_ID(GRAVED),VNDR_LOC会区分行,但是在第二个使用VENDOR_ID(SCIMED)的查询中,业务单位是区分符。

enter image description here

SELECT  A.BUSINESS_UNIT, E.DEPTID, A.PO_ID, B.SHIPTO_ID, A.VENDOR_ID, 
C.VENDOR_NAME_SHORT, A.PRICE_LOC, D.STD_ID_NUM 
FROM ((((PS_PO_HDR A 
LEFT OUTER JOIN  PS_PO_DFLT_TBL B ON  A.BUSINESS_UNIT = B.BUSINESS_UNIT AND 
 A.PO_ID = B.PO_ID ) 
LEFT OUTER JOIN  PS_VENDOR C ON  C.VENDOR_ID = A.VENDOR_ID ) 
LEFT OUTER JOIN  PS_GH_VNDR_ACCT_ID D ON  C.SETID = D.SETID AND C.VENDOR_ID 
 = D.VENDOR_ID  AND D.VNDR_LOC = A.VNDR_LOC )
LEFT OUTER JOIN  PS_PO_LINE_DISTRIB E ON  A.BUSINESS_UNIT = E.BUSINESS_UNIT 
 AND A.PO_ID = E.PO_ID ) 
WHERE ( A.PO_ID = 'K090000774') 

我的结果就是我从上述查询中获得的结果,我正在使用STD_ID_NUM'839819059'检索1行,但这仅仅是因为我没有在BUSINESS_UNIT上加入PS_GH_VNDR_ACCT_ID。

enter image description here

如果我将BUSINESS_UNIT添加到PS_​​GH_VNDR_ACCT_ID联接表上的联接中,则:

   LEFT OUTER JOIN  PS_GH_VNDR_ACCT_ID D ON  C.SETID = D.SETID AND 
   C.VENDOR_ID = D.VENDOR_ID  AND D.VNDR_LOC = A.VNDR_LOC AND  
   D.BUSINESS_UNIT = A.BUSINESS_UNIT) 

然后我在STD_ID_NUM列上得到了一个N​​ULL值,因为该特定供应商未指定BUSINESS_UNIT。

但是,如果我在联接上不使用BUSINESS_UNIT,那么对于另一个供应商(SCIMED),我将获得几行重复的行,因为没有其他可区分每行的内容。

enter image description here

我想我需要对连接使用IF /条件语句,如果该行的PS_GH_VNDR_ACCT_ID表中存在BUSINESS_UNIT,然后在BUSINESS_UNIT上进行连接 AND SETID AND < / strong> VENDOR_ID AND VNDR_LOC,否则,如果未填充BUSINESS_UNIT一行,则只能加入SETID AND VENDOR_ID AND VNDR_LOC。

1 个答案:

答案 0 :(得分:1)

一种方法是: 对于PS_GH_VNDR_ACCT_ID中存在空值的情况,有一个附加的LEFT OUTER JOIN:

LEFT OUTER JOIN PS_GH_VNDR_ACCT_ID D 
       ON  C.SETID = D.SETID AND 
           C.VENDOR_ID = D.VENDOR_ID  AND 
           D.VNDR_LOC = A.VNDR_LOC AND 
           D.BUSINESS_UNIT = A.BUSINESS_UNIT)
LEFT OUTER JOIN PS_GH_VNDR_ACCT_ID D2 
       ON  C.SETID = D2.SETID AND 
           C.VENDOR_ID = D2.VENDOR_ID  AND 
           D2.VNDR_LOC = A.VNDR_LOC AND 
           D2.BUSINESS_UNIT IS NULL)

并修改SELECT行:

SELECT  A.BUSINESS_UNIT, E.DEPTID, A.PO_ID, B.SHIPTO_ID, A.VENDOR_ID, C.VENDOR_NAME_SHORT, A.PRICE_LOC, D.STD_ID_NUM 

收件人

SELECT A.BUSINESS_UNIT, 
       E.DEPTID, 
       A.PO_ID, 
       B.SHIPTO_ID, 
       A.VENDOR_ID, 
       C.VENDOR_NAME_SHORT, 
       A.PRICE_LOC, 
       COALESCE(D.STD_ID_NUM, D2.STD_ID_NUM)

所有这些都假设您更喜欢这样的解决方案,在该解决方案中,BUSINESS_UNIT可用于选择一个唯一的大小写,然后将其默认为NULL。
请注意-没有测试数据,我不能完全确定这是否可以正常工作。