我正在编写一个查询,该查询的左外部连接到一个表,该表包含一个要显示为列的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)的查询中,业务单位是区分符。
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。
如果我将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列上得到了一个NULL值,因为该特定供应商未指定BUSINESS_UNIT。
但是,如果我在联接上不使用BUSINESS_UNIT,那么对于另一个供应商(SCIMED),我将获得几行重复的行,因为没有其他可区分每行的内容。
我想我需要对连接使用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。
答案 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。
请注意-没有测试数据,我不能完全确定这是否可以正常工作。