不用键加入 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_TBLPS_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_IDPYMNT_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