Aggiornare i record nella tabella da CTE

Ho il seguente CTE che mi darà il DocTotal per l’intera fattura.

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

UPDATE PEDI_InvoiceDetail
SET DocTotal = CTE_DocTotal.DocTotal

Ora, con questo risultato voglio entrare in questa colonna la DocTotal valore all’interno PEDI_InvoiceDetail.

So che non è andare a lavorare e so che mi manca qualcosa, che cosa è?

  • Io ho scelto la CTE opzione per migliorare le prestazioni.
InformationsquelleAutor Etienne | 2012-07-19



4 Replies
  1. 96

    Aggiornamenti che si fanno per la CTE sarà in cascata per la tabella di origine.

    Ho dovuto indovinare il vostro schema di poco, ma qualcosa come questo dovrebbe funzionare.

    ;WITH T AS
    (   SELECT  InvoiceNumber, 
                DocTotal, 
                SUM(Sale + VAT) OVER(PARTITION BY InvoiceNumber) AS NewDocTotal
        FROM    PEDI_InvoiceDetail
    )
    UPDATE  T
    SET     DocTotal = NewDocTotal
    • È CTE AGGIORNAMENTO atomica , se esegui un concorrente query i record aggiornati due volte ?
    • Una CTE aggiornamento non è diverso da un normale aggiornamento. È atomica e avrà la stessa tabella/riga serrature. Non è altro che zucchero sintattico
  2. 30
    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. 22

    Non hai bisogno di una CTE per questo

    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
    • Ma qual è il modo corretto di fare questo? Che è più veloce? Che è più leggibile?
    • e “leggibilità” in SQL sono un certo grado di soggettività e di una questione di gusto. Tuttavia, alcuni storici versioni di SQL server non contengono la CTE funzione.
    • SQLite3 3.8.11.1 si lamenta: Errore: vicino a “DA”: errore di sintassi
    • Questa domanda è su SQL Server. SQLite avrà la propria sintassi
    • La domanda è su come aggiornare i record da CTE, non su approcci alternativi. Ci sono diversi motivi che l’OP abbia voluto utilizzare una CTE, che non ha rivelato in questione.
    • L’OP dice “voglio entrare nella colonna di DocTotal valore all’interno PEDI_InvoiceDetail.” Non e ‘ lui a dire che ha bisogno o vuole necessariamente utilizzare una CTE.
    • Corretto, tranne per il fatto che egli riassume la sua domanda nel titolo: “Aggiornamento dei record nella tabella da CTE”. Come prova sto leggendo l’OP desiderio di una risposta che coinvolge un CTE, presentare come prova del fatto che egli ha accettato una risposta, fornendo una soluzione con un CTE e che ha dichiarato in un follow-up di commento che ha scelto un CTE per le prestazioni.
    • In realtà l’aggiornamento stessa tabella, basata su una query della tabella pausa di concorrenza e di forza, la query da eseguire due volte. Una volta, correttamente, e, infine, con il valore finale, che è l’ultimo record della sottoquery. Provare

  4. 0

    Provare la seguente query:

    ;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

Lascia un commento