2012-07-19 19 views
36

Tengo el siguiente CTE que me dará el DocTotal para la factura completa.Actualizar registros en la tabla de 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 

Ahora, con este resultado que quieren entrar en la columna de valor en el interior DocTotal PEDI_InvoiceDetail.

Sé que no va a funcionar y sé que me falta algo, ¿qué es?

+0

he elegido la opción de CTE para un mejor rendimiento. – Etienne

Respuesta

69

actualizaciones que realice en el CTE será en cascada a la tabla de origen.

He tenido que adivinar un poco su esquema, pero algo así debería funcionar.

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

¿ACTUALIZACIÓN CTE atómica, si se ejecutan consultas concurent, los mismos registros se actualizarán dos veces? –

+0

Una actualización de CTE no es diferente de una actualización normal. Es atómico y tomará los mismos bloqueos de tabla/fila. No es nada más que azúcar sintáctica – GarethD

16

No es necesario un CTE para este

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

Pero, ¿cuál es la forma correcta de hacerlo? ¿Cual es mas rápido? ¿Cuál es más legible? – Zack

+3

@Zack "Corrección" y "legibilidad" en SQL son hasta cierto punto subjetivos y una cuestión de gusto. Sin embargo, algunas versiones históricas de SQL Server no contienen la característica CTE. – podiluska

+0

SQLite3 3.8.11.1 se queja: Error: cerca de "FROM": error de sintaxis –

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

Pruebe la siguiente consulta:

;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 
Cuestiones relacionadas