복붙노트

[SQL] CTE에서 테이블의 업데이트 기록

SQL

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 값을 입력합니다.

그것이 무엇인가, 내가 일하지 않을 알고 내가 뭔가를 놓친 거지 알아?

해결법

  1. ==============================

    1.열팽창 계수에 당신이 만드는 업데이트는 소스 테이블에 계단식됩니다.

    열팽창 계수에 당신이 만드는 업데이트는 소스 테이블에 계단식됩니다.

    나는 약간 스키마 추측했다, 그러나이 같은 작업을해야합니다.

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

    2.

    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 ...
    
  3. ==============================

    3.당신은 이것에 대한 CTE가 필요하지 않습니다

    당신은 이것에 대한 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
    
  4. ==============================

    4.다음 쿼리를보십시오 :

    다음 쿼리를보십시오 :

    ;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
    
  5. from https://stackoverflow.com/questions/11562536/update-records-in-table-from-cte by cc-by-sa and MIT license