IF Join 或 Where 子句的条件条件

IF conditonal criteria on Join or Where clause

我正在编写一个查询,它有一个左外连接到 table,其中包含一个 ID 号字段 (STD_ID_NUM),我将其显示为一列。带有ID号字段的table有键字段SETID,VENDOR_ID,和VNDR_LOC。 BUSINESS_UNIT 不是关键字段,但在某些情况下,它是区分一行与另一行的唯一列。我最初在 PS_GH_VNDR_ACCT_ID 的连接中包括业务单位,但是因为业务单位字段是可选的,所以有些行没有为业务单位填充值,因此我的查询没有 return STD_ID_NM.

如您所见,业务部门在此 table 中不是必填字段。在某些情况下,例如第一个 VENDOR_ID (GRAVED),VNDR_LOC 区分行,但是在第二个查询 VENDOR_ID (SCIMED) 的情况下,业务部门是区分器。

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 行,但这只是因为我没有在 [=49= 上加入 PS_GH_VNDR_ACCT_ID ].

如果我将 BUSINESS_UNIT 添加到我在 PS_GH_VNDR_ACCT_ID 上的连接 table:

   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 列上得到一个 NULL 值,因为这个特定的供应商没有指定 BUSINESS_UNIT。

但是,如果我在加入时不使用 BUSINESS_UNIT,那么对于其他供应商 (SCIMED),我会得到多个重复行,因为没有其他东西可以区分每一行。

我想我需要使用 IF/conditional 语句来连接,如果 PS_GH_VNDR_ACCT_ID table 中有 BUSINESS_UNIT 行然后连接关于 BUSINESS_UNIT AND SETID AND VENDOR_ID AND VNDR_LOC , 否则如果 BUSINESS_UNIT 没有填充一行而不是加入 SETID AND VENDOR_ID AND VNDR_LOC只要。

一种方法如下: 对于 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 可用于 select 独特情况的解决方案,首先使用 NULL 作为默认值。
请注意 - 没有测试数据,我不能完全确定这是否会毫无问题地工作。