在 SQL 中使用 CTE 来标记 DUPLICATES 并在子查询中引用

Use CTE in SQL to flag DUPLICATES and reference in sub-query

所以我有以下 CTE:

with dupeinv AS (
select * from (
select
tci.t_idoc,
tci.t_idat,
ROW_NUMBER() OVER (partition by tci.t_idoc ORDER BY tci.t_idoc, tci.t_idat DESC) as rn
from [ln106].[dbo].tcisli305100 tci
) as t
where t.rn = 1
)

上面table ([ln106].[dbo].tcisli305100) 中有重复项,因此 CTE 获取单个值。我只想在下面的查询中格式化这些值(以 --- 为前缀)


select 'JCI' as BU,
    RTRIM(LTRIM(cl.t_orno)) AS SALES_ORDER_NUMBER
    , cl.t_pono AS SALES_ORDER_LINE_NUMBER
    , CONCAT(cl.t_shpm, cl.t_pono, cl.t_idoc)  AS SHIPPING_RECORD_ID
    ,CASE WHEN cl.t_dqua = 0 or cl.t_dqua is null THEN cl.t_amti ELSE
     cl.t_amti / cl.t_dqua END AS AR_INVOICE_LINE_ITEM_PRICE_LOCAL
    , cl.t_line AS AR_INVOICE_LINE_NUMBER
    , cl.t_dqua AS AR_INVOICE_LINE_ITEM_QUANTITY
--- , concat(dupeinv.t_idoc,'|',format(dupeinv.t_idat,'MMddyyyy') ---
     ,ci.t_ccur AS AR_INVOICE_CURRENCY
    , ci.t_idat AS AR_INVOICE_DATE
    FROM [ln106].[dbo].tcisli310100 cl
    LEFT JOIN [ln106].[dbo].tcisli305100 ci ON cl.t_idoc = ci.t_idoc
    LEFT JOIN t di on cl.t_doc = di_t_doc
    LEFT JOIN (SELECT t_orno,t_pono FROM [ln106].[dbo].ttdsls401100 WHERE t_oltp <> 1 group by t_orno,t_pono) as l --Jed 10162020 Changed the join to prevent duplicate records
    ON l.t_orno=cl.t_orno COLLATE SQL_Latin1_General_CP1_CI_AS AND l.t_pono=cl.t_pono
    LEFT JOIN dupeinv tci on cl.r_idoc = ci.t_doc
    WHERE ci.t_idat > '2017'

查询不喜欢我在主查询中引用它。谁能提供帮助或提出更好的建议?

您的最终查询应如下所示:

WITH dupeinv AS
  (SELECT *
   FROM
     (SELECT tci.t_idoc,
             tci.t_idat,
             ROW_NUMBER() OVER (PARTITION BY tci.t_idoc
                                ORDER BY tci.t_idoc,
                                         tci.t_idat DESC) AS rn
      FROM [ln106].[dbo].tcisli305100 tci) AS t
   WHERE t.rn = 1 )
SELECT 'JCI' AS BU,
       RTRIM(LTRIM(cl.t_orno)) AS SALES_ORDER_NUMBER ,
       cl.t_pono AS SALES_ORDER_LINE_NUMBER ,
       CONCAT(cl.t_shpm, cl.t_pono, cl.t_idoc) AS SHIPPING_RECORD_ID ,
       CASE
           WHEN cl.t_dqua = 0
                OR cl.t_dqua IS NULL THEN cl.t_amti
           ELSE cl.t_amti / cl.t_dqua
       END AS AR_INVOICE_LINE_ITEM_PRICE_LOCAL ,
       cl.t_line AS AR_INVOICE_LINE_NUMBER ,
       cl.t_dqua AS AR_INVOICE_LINE_ITEM_QUANTITY ,
       concat(dupeinv.t_idoc,
              '|',
              format(dupeinv.t_idat, 'MMddyyyy')) ,
       ci.t_ccur AS AR_INVOICE_CURRENCY ,
       ci.t_idat AS AR_INVOICE_DATE
FROM [ln106].[dbo].tcisli310100 cl
LEFT JOIN [ln106].[dbo].tcisli305100 ci ON cl.t_idoc = ci.t_idoc
LEFT JOIN t di ON cl.t_doc = di_t_doc
LEFT JOIN
  (SELECT t_orno,
          t_pono
   FROM [ln106].[dbo].ttdsls401100
   WHERE t_oltp <> 1
   GROUP BY t_orno,
            t_pono) AS l --Jed 10162020 Changed the join to prevent duplicate records
 ON l.t_orno=cl.t_orno COLLATE SQL_Latin1_General_CP1_CI_AS
AND l.t_pono=cl.t_pono
LEFT JOIN dupeinv tci ON cl.r_idoc = ci.t_doc
WHERE ci.t_idat > '2017'