programing

CTE에서 테이블 내의 레코드 갱신

starjava 2023. 4. 12. 21:40
반응형

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

반응형