不用键加入 table 获取相关行
Join to table without key to get related row
我在一个视图中有以下 CTE 查询,我需要 Group By
来自 table PS_PAYMENT_TBL
的一个名为 PYMNT_DT
的字段,如下所示,它具有以下标准:
BOX16DATA AS
( SELECT A.VOUCHER_ID, A.PYMNT_TYPE , SUM(A.PAID_AMT) AS BOX16PAIDAMT , SUM(A.PYMNT_GROSS_AMT) AS WTHD_BOX16 , B.VENDOR_ID ,
YEAR(C.PYMNT_DT) AS 'YEAR1'
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_VOUCHER B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID
INNER JOIN PS_PAYMENT_TBL C ON --(THIS WILL NOT WORK-->)--C.PYMNT_ID = A.PYMNT_ID
WHERE A.PYMNT_TYPE = 'W' AND A.REMIT_VENDOR = '47860A'
AND C.PYMNT_STATUS NOT IN ('S', 'V')
GROUP BY B.VENDOR_ID, A.PYMNT_TYPE, YEAR(C.PYMNT_DT) )
问题是从上述查询中检索到的所有行在 PS_PAYMENT_TBL
或 PS_PYMNT_VCHR_XREF
中永远不会有 PYMNT_ID
(因为 PYMNT_TYPE
是 = 'W'
) 所以我不能按照现在的写法在 PYMNT_ID 上使用上面的连接(缩进)。然而,从上述查询中检索到的 VOUCHER_ID
将始终在 PS_PYMNT_VCHR_XREF
中有第二个对应行,该行具有 PYMNT_ID
的行。这是一个例子:
我需要做的是从相关行(具有与上面第一个查询中检索到的凭证 ID 相同的凭证 ID)中获取 PYMNT_ID
,然后我可以使用它来正确加入 PS_PAYMENT_TBL
获取 PYMNT_DT
字段。我的目标是在相关行上获取 PYMNT_ID
,我可以使用它来加入 PS_PAYMENT_TBL
我想我也许可以使用另一个 CTE 来获取与 PYMNT_ID
相关的行,然后使用它加入我的第一个查询。我不确定我应该怎么做。
您可以使用另一个 CTE
来获取给定 VOUCHER_ID
的 PYMNT_ID
值,例如
VIPI AS (
SELECT VOUCHER_ID, MAX(PYMNT_ID) AS PYMNT_ID
FROM PS_PYMNT_VCHR_XREF
GROUP BY VOUCHER_ID
)
然后 BOX16DATA
CTE 中的 JOIN
变为
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_VOUCHER B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID
INNER JOIN VIPI ON VIPI.VOUCHER_ID = A.VOUCHER_ID
INNER JOIN PS_PAYMENT_TBL C ON C.PYMNT_ID = VIPI.PYMNT_ID
我在一个视图中有以下 CTE 查询,我需要 Group By
来自 table PS_PAYMENT_TBL
的一个名为 PYMNT_DT
的字段,如下所示,它具有以下标准:
BOX16DATA AS
( SELECT A.VOUCHER_ID, A.PYMNT_TYPE , SUM(A.PAID_AMT) AS BOX16PAIDAMT , SUM(A.PYMNT_GROSS_AMT) AS WTHD_BOX16 , B.VENDOR_ID ,
YEAR(C.PYMNT_DT) AS 'YEAR1'
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_VOUCHER B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID
INNER JOIN PS_PAYMENT_TBL C ON --(THIS WILL NOT WORK-->)--C.PYMNT_ID = A.PYMNT_ID
WHERE A.PYMNT_TYPE = 'W' AND A.REMIT_VENDOR = '47860A'
AND C.PYMNT_STATUS NOT IN ('S', 'V')
GROUP BY B.VENDOR_ID, A.PYMNT_TYPE, YEAR(C.PYMNT_DT) )
问题是从上述查询中检索到的所有行在 PS_PAYMENT_TBL
或 PS_PYMNT_VCHR_XREF
中永远不会有 PYMNT_ID
(因为 PYMNT_TYPE
是 = 'W'
) 所以我不能按照现在的写法在 PYMNT_ID 上使用上面的连接(缩进)。然而,从上述查询中检索到的 VOUCHER_ID
将始终在 PS_PYMNT_VCHR_XREF
中有第二个对应行,该行具有 PYMNT_ID
的行。这是一个例子:
我需要做的是从相关行(具有与上面第一个查询中检索到的凭证 ID 相同的凭证 ID)中获取 PYMNT_ID
,然后我可以使用它来正确加入 PS_PAYMENT_TBL
获取 PYMNT_DT
字段。我的目标是在相关行上获取 PYMNT_ID
,我可以使用它来加入 PS_PAYMENT_TBL
我想我也许可以使用另一个 CTE 来获取与 PYMNT_ID
相关的行,然后使用它加入我的第一个查询。我不确定我应该怎么做。
您可以使用另一个 CTE
来获取给定 VOUCHER_ID
的 PYMNT_ID
值,例如
VIPI AS (
SELECT VOUCHER_ID, MAX(PYMNT_ID) AS PYMNT_ID
FROM PS_PYMNT_VCHR_XREF
GROUP BY VOUCHER_ID
)
然后 BOX16DATA
CTE 中的 JOIN
变为
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_VOUCHER B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID
INNER JOIN VIPI ON VIPI.VOUCHER_ID = A.VOUCHER_ID
INNER JOIN PS_PAYMENT_TBL C ON C.PYMNT_ID = VIPI.PYMNT_ID