IT story

CTE에서 테이블의 레코드 업데이트

hot-time 2021. 1. 5. 19:14
반응형

CTE에서 테이블의 레코드 업데이트


전체 송장에 대한 DocTotal을 제공하는 다음 CTE가 있습니다.

 ;WITH CTE_DocTotal
 AS
 (
   SELECT SUM(Sale + VAT) AS DocTotal
   FROM PEDI_InvoiceDetail
   GROUP BY InvoiceNumber
 )

UPDATE PEDI_InvoiceDetail
SET DocTotal = CTE_DocTotal.DocTotal

이제이 결과로 PEDI_InvoiceDetail 내의 DocTotal 값을 열에 입력하고 싶습니다.

나는 작동하지 않을 것이라는 것을 알고 있고 내가 무언가를 놓치고 있다는 것을 알고 있습니다. 무엇입니까?


CTE에 대한 업데이트는 소스 테이블에 계단식으로 적용됩니다.

나는 당신의 스키마를 약간 추측해야했지만 이와 같은 것이 작동합니다.

;WITH T AS
(   SELECT  InvoiceNumber, 
            DocTotal, 
            SUM(Sale + VAT) OVER(PARTITION BY InvoiceNumber) AS NewDocTotal
    FROM    PEDI_InvoiceDetail
)
UPDATE  T
SET     DocTotal = NewDocTotal

WITH CTE_DocTotal (DocTotal, InvoiceNumber)
AS
(
    SELECT  InvoiceNumber,
            SUM(Sale + VAT) AS DocTotal
    FROM    PEDI_InvoiceDetail
    GROUP BY InvoiceNumber
)    
UPDATE PEDI_InvoiceDetail
SET PEDI_InvoiceDetail.DocTotal = CTE_DocTotal.DocTotal
FROM CTE_DocTotal
INNER JOIN PEDI_InvoiceDetail ON ...

이를 위해 CTE가 필요하지 않습니다.

UPDATE PEDI_InvoiceDetail
SET
    DocTotal = v.DocTotal
FROM
     PEDI_InvoiceDetail
inner join 
(
   SELECT InvoiceNumber, SUM(Sale + VAT) AS DocTotal
   FROM PEDI_InvoiceDetail
   GROUP BY InvoiceNumber
) v
   ON PEDI_InvoiceDetail.InvoiceNumber = v.InvoiceNumber

다음 쿼리를 시도하십시오.

;WITH CTE_DocTotal
 AS
 (
   SELECT SUM(Sale + VAT) AS DocTotal_1
   FROM PEDI_InvoiceDetail
   GROUP BY InvoiceNumber
 )

UPDATE CTE_DocTotal
SET DocTotal = CTE_DocTotal.DocTotal_1

참조 URL : https://stackoverflow.com/questions/11562536/update-records-in-table-from-cte

반응형