2012-07-19 8 views
36

Tüm fatura için bana DocTotal verecek olan aşağıdaki CTE'ye sahibim.Tablodaki kayıtları CTE ile güncelleyin

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

UPDATE PEDI_InvoiceDetail 
SET DocTotal = CTE_DocTotal.DocTotal 

Şimdi bu sonuçla ben sütuna PEDI_InvoiceDetail içeride DocTotal değerini girmek istiyorum.

İşe yaramayacağını biliyorum ve bir şeyleri kaçırdığımı biliyorum, ne var?

+0

:

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

cevap

69

Güncellemeler için bir CTE gerekmez.

Şemanınızda biraz tahmin etmem gerekiyordu, ama bunun gibi bir şey işe yaramalı. Daha iyi performans için CTE seçeneği seçmiş

;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 
+0

CTE UPDATE atomik midir, eğer uyumlu sorgular çalıştırılırsa aynı kayıtlar iki kez güncellenir mi? –

+0

CTE güncellemesi normal güncellemeden hiç farklı değildir. Atomiktir ve aynı tablo/satır kilitlerini alır. Sözdizimsel şekerden başka bir şey değil – GarethD

16

Kaynak tabloya basamaklı olacak CTE yaptığınız bu

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 
+0

Ama bunu yapmanın doğru yolu nedir? Hangisi daha hızlı? Hangisi daha okunabilir? SQL'de – Zack

+3

@Zack "Düzeltme" ve "okunabilirlik" bir ölçüde öznel ve bir tat meselesidir. Ancak, bazı SQL Server sürümleri CTE özelliğini içermiyor. – podiluska

+0

SQLite3 3.8.11.1 şikayet ediyor: Hata: "FROM" yakınında: sözdizimi hatası –

23
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 ...