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 作为默认值。
请注意 - 没有测试数据,我不能完全确定这是否会毫无问题地工作。
我正在编写一个查询,它有一个左外连接到 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 JOINLEFT 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 作为默认值。
请注意 - 没有测试数据,我不能完全确定这是否会毫无问题地工作。