Corso SQL Server

SQL Server lezione #07 Come inserire, aggiornare, ed eliminare i dati

 

Come inserire, aggiornare, ed eliminare i dati

Nelle ultime quattro lezioni, hai imparato a codificare l'istruzione SELECT per recuperare e riassumere i dati. Ora, imparerai a codificare le istruzioni INSERT, UPDATE e DELETE per modificare i dati in una tabella. Quando avrai finito questo capitolo, saprai come codificare le quattro istruzioni che vengono utilizzate ogni giorno dai programmatori SQL professionisti.

Come creare tabelle di test

Mentre impari a codificare le istruzioni INSERT, UPDATE e DELETE, devi assicurarti che la tua sperimentazione non influisca sui dati "live" o su un database di classe condiviso da altri studenti. Di seguito vengono presentati due modi per aggirare il problema.

Come utilizzare l'istruzione SELECT INTO

L'esempio che segue mostra come usare l'istruzione SELECT INTO per creare tabelle di prova derivate dalle tabelle di un database. Quindi, puoi sperimentare tutto ciò che vuoi con le tabelle di prova ed eliminarle quando hai finito. Quando usi l'istruzione SELECT INTO, il set di risultati definito dall'istruzione SELECT viene semplicemente copiato in una nuova tabella. I tre esempi in questa figura mostrano alcuni dei modi in cui puoi usare questa istruzione. Qui, il primo esempio copia tutte le colonne da tutte le righe nella tabella Fatture in una nuova tabella denominata lnvoiceCopy. Il secondo esempio copia tutte le colonne nella tabella Fatture in una nuova tabella, ma solo per le righe in cui il saldo dovuto è zero. E il terzo esempio crea una tabella che contiene i dati di riepilogo dalla tabella Fatture. Per gli esempi nel resto di questo capitolo, ho usato l'istruzione SELECT INTO per fare copie delle tabelle Vendors e Invoices e ho chiamato queste tabelle VendorCopy e lnvoiceCopy. Se fai lo stesso, eviterai di corrompere il database originale. Quindi, quando hai finito di sperimentare, puoi usare l'istruzione DROP TABLE mostrata in questa figura per eliminare le tabelle di prova. Quando usi questa tecnica per creare tabelle, però, solo le definizioni di colonna e i dati vengono copiati, il che significa che definizioni come quelle di chiavi primarie, chiavi esterne e valori predefiniti non vengono mantenute. Di conseguenza, i risultati dei test che ottieni con le tabelle copiate potrebbero essere leggermente diversi dai risultati che otterresti con le tabelle originali. Lo capirai meglio dopo aver letto le lezioni 10 e 11.

La sintassi dell'istruzione SELECT INTO

    SELECT select_list
    INTO table_name
    FROM table_source
    [WHERE search_condition]
    [GROUP BY group_by_list]
    [HAVING search_condition]
    [ORDER BY order_by_list]
                

Un'istruzione che crea una copia completa della tabella Fatture

    USE AP
    GO
    SELECT *
    INTO InvoiceCopy
    FROM Invoices
                

Un'istruzione che crea una copia parziale della tabella Fatture

    USE AP
    GO
    SELECT *
    INTO OldInvoices
    FROM Invoices
    WHERE (InvoiceTotal - PaymentTotal - CreditTotal) = 0
                

Un'istruzione che crea una tabella con righe di riepilogo

    USE AP
    GO
    SELECT VendorID, SUM(InvoiceTotal) AS SumOfInvoices
    INTO VendorBalances
    FROM Invoices
    WHERE (InvoiceTotal - PaymentTotal - CreditTotal) <> 0
    GROUP BY VendorID
                

Visualizziamo la tabella con righe di riepilogo

    USE AP
    GO
    SELECT *
    FROM VendorBalances
                

Un'istruzione che cancella una tabella

    USE AP
    GO
    DROP TABLE InvoiceCopy
                

Descrizione

Come inserire nuove righe

Per aggiungere nuove righe a una tabella, si utilizza l'istruzione INSERT. Questa istruzione consente di inserire una singola riga o più righe.

Come inserire una singola riga

L'esempio che segue mostra come codificare un'istruzione INSERT per inserire una singola riga. I due esempi in questa figura inseriscono una riga nella tabella InvoiceCopy. I dati contenuti in questa nuova riga sono definiti nella parte superiore della figura. Nel primo esempio, si può notare che nella clausola INSERT si nomina la tabella in cui verrà inserita la riga. Poi, nella clausola VALUES si elencano i valori da utilizzare per ogni colonna. Si possono notare tre cose in questo elenco. Primo, include un valore per ogni colonna della tabella, tranne che per la colonna InvoiceID. Questo valore viene omesso perché la colonna InvoiceID è definita come una colonna identity Per questo motivo, il suo valore sarà generato da SQL Server. Secondo, i valori sono elencati nella stessa sequenza in cui le colonne appaiono nella tabella. In questo modo, SQL Server sa quale valore assegnare a quale colonna. E terzo, viene assegnato un valore nullo all'ultima colonna, PaymentDate, utilizzando la parola chiave NULL. L'uso di questa parola chiave sarà illustrato nel prossimo argomento. La seconda istruzione INSERT di questa figura include un elenco di colonne nella clausola INSERT. Si noti che questo elenco non include la colonna PaymentDate poiché consente un valore nullo. Inoltre, le colonne non sono elencate nella stessa sequenza delle colonne della tabella InvoiceCopy. Quando si include un elenco di colonne è possibile codificare le colonne nella sequenza desiderata. In tal caso, è sufficiente codificare le colonne nella sequenza desiderata. Quando si specificano i valori delle colonne da inserire, è necessario assicurarsi che tali valori siano compatibili con i tipi di dati delle colonne. Ad esempio, i valori letterali delle date e delle stringhe devono essere racchiusi tra apici singoli. Tuttavia, non è necessario racchiudere tra apici singoli i valori letterali dei numeri. Per saperne di più sui tipi di dati e su come lavorarli, si veda il prossimo capitolo. Per ora, è sufficiente tenere presente che se uno qualsiasi dei valori non è compatibile con i tipi di dati delle colonne corrispondenti, si verificherà un errore e la riga non verrà inserita.

Come inserire più righe

SQL Server 2008 ha esteso la sintassi dell'istruzione INSERT per consentire a una singola istruzione INSERT di inserire più righe. Per farlo, basta usare una virgola per separare gli elenchi di valori multipli, come mostrato nella terza istruzione INSERT. Sebbene questa sintassi non fornisca un guadagno in termini di prestazioni, fornisce un modo più conciso di scrivere il codice rispetto alla codifica di più istruzioni INSERT.

La sintassi dell'istruzione INSERT

    INSERT [INTO] table_name [ ( column_list ) ]
    [DEFAULT] VALUES (expression_l [, expression_2] ... )
    [, ( expression_l [, expression_2] ... ) ... ]
                

I valori per una nuova riga da aggiungere alla tabella Fatture

ColonnaValore
Invoice ID(Next available unique ID)
VendorID97
InvoiceNumber456789
InvoiceDate25/12/2022
InvoiceTotal8,344.50
Payment Total0
CreditTotal0
Terms ID1
InvoiceDueDate25/01/2023
PaymentDateNULL

Un'istruzione INSERT che aggiunge la nuova riga senza utilizzare un elenco di colonne

    
    USE AP
    GO
    INSERT INTO Invoices
    VALUES (97, '456789','2022-12-25', 8344.50, 0, 0, 1, '2023-01-25', NULL)
                

Un'istruzione INSERT che aggiunge la nuova riga utilizzando un elenco di colonne

    USE AP
    GO
    INSERT INTO Invoices 
        (VendorID, InvoiceNumber, InvoiceTotal, PaymentTotal, CreditTotal,
        TermsID, InvoiceDate, InvoiceDueDate)
    VALUES
        (97, '456790', 8640.50, 0, 0, 1, '2023-03-01', '2023-03-31')
                

Un'istruzione INSERT che aggiunge tre nuove righe

    USE AP
    GO
    INSERT INTO Invoices 
    VALUES 
        (95, '111-10098', '2023-03-01', 219.50, 0, 0, 1, '2023-03-31', NULL),
        (102, '109596', '2023-03-01', 22.97, 0, 0, 1, '2023-03-31', NULL),
        (72, '40319', '2023-03-01', 173.38, 0, 0, 1, '2023-03-31', NULL)
                

Descrizione

Come inserire valori predefiniti e valori nulli

Se una colonna consente valori nulli, è necessario sapere come inserire un valore nullo in quella colonna. Allo stesso modo, se una colonna è definita con un valore predefinito, si vorrà sapere come inserire quel valore. La tecnica da utilizzare dipende dal fatto che l'istruzione INSERT include o meno un elenco di colonne, come mostrano gli esempi che seguono. Tutte queste istruzioni INSERT utilizzano una tabella denominata ColorSample. Questa tabella contiene le tre colonne mostrate nella parte superiore della figura. La prima colonna, ID, è definita come colonna identità. La seconda colonna, ColorNumber, è definita con un valore predefinito di 0. La terza colonna, ColorName, è definita in modo da consentire valori nulli. Le prime due istruzioni illustrano come assegnare un valore predefinito o un valore nullo utilizzando un elenco di colonne. Per farlo, è sufficiente omettere la colonna dall'elenco. Nella prima istruzione, per esempio, l'elenco di colonne nomina solo la colonna ColorNumber, quindi alla colonna NomeColore viene assegnato un valore nullo. Analogamente, l'elenco di colonne nella seconda istruzione nomina solo la colonna ColorName, quindi alla colonna ColorNumber viene assegnato il valore predefinito. Le tre istruzioni successive mostrano come assegnare un valore predefinito o nullo a una colonna senza includere un elenco di colonne. Come si può vedere, ciò avviene utilizzando le parole chiave DEFAULT e NULL. Per esempio, la terza istruzione specifica un valore per la colonna ColorName, ma utilizza la parola chiave DEFAULT per la colonna ColorNumber. Per questo motivo, SQL Server assegnerà il valore zero a questa colonna. La quarta istruzione assegna un valore di 808 alla colonna ColorNumber e utilizza la parola chiave NULL per assegnare un valore nullo alla colonna ColorName. La quinta istruzione utilizza entrambe le parole chiave DEFAULT e NULL. Infine, nella sesta istruzione, la parola chiave DEFAULT è codificata davanti alla clausola VALUES. Quando si usa la parola chiave DEFAULT in questo modo, a qualsiasi colonna che abbia un valore predefinito verrà assegnato tale valore, mentre a tutte le altre colonne (eccetto la colonna identità) verrà assegnato un valore nullo. Questa tecnica può essere utilizzata solo quando ogni colonna della tabella è definita come una colonna identità, una colonna con un valore predefinito o una colonna che ammette valori nulli.

La definizione della tabella ColorSample

tabella ColorSample
Nome della colonnaTipo di datiLunghezzaIdentitàConsente valori nulliValore predefinito
IDInt4NoNo
ColorNumberInt4NoNo0
ColorNameVarChar10NoNo

Creare la tabella ColorSample

    USE AP
    GO
    IF OBJECT_ID('ColorSample') IS NOT NULL
        DROP TABLE ColorSample
    GO
    -- create the ColorSample table
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO    
    CREATE TABLE ColorSample (
        ID int IDENTITY(1,1) NOT NULL,
        ColorNumber int NOT NULL CONSTRAINT DF_ColorSample_ColorNumber DEFAULT 0,
        ColorName varchar(10) NULL,
        CONSTRAINT [PK_ColorSample] PRIMARY KEY CLUSTERED
        (
            ID ASC
        ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
    ) 
    GO
                

Sei istruzioni INSERT per la tabella ColorSample

    USE AP
    GO               
    INSERT INTO ColorSample (ColorNumber)
    VALUES (606);
    
    INSERT INTO ColorSample (ColorName)
    VALUES ('Yellow');
    
    INSERT INTO ColorSample
    VALUES (DEFAULT, 'Orange');
    
    INSERT INTO ColorSample
    VALUES (808, NULL);
    
    INSERT INTO ColorSample (ColorNumber, ColorName)
    VALUES (DEFAULT, NULL);
    
    INSERT INTO ColorSample
    DEFAULT VALUES;
    
    SELECT * FROM ColorSample;
                

Descrizione

Come inserire righe selezionate da un'altra tabella

Invece di utilizzare la clausola VALUES dell'istruzione INSERT per specificare i valori di una singola riga, è possibile utilizzare una subquery per selezionare le righe che si desidera inserire da un'altra tabella. La Figura che segue mostra come fare. Entrambi gli esempi in questa figura recuperano le righe dalla tabella InvoiceCopy e le inseriscono in una tabella denominata InvoiceArchive. Questa tabella è definita con le stesse colonne della tabella InvoiceCopy. Tuttavia, la colonna InvoiceID non è definita come colonna identità, e le colonne PaymentTotal e CreditTotal non sono definite con valori predefiniti. Per questo motivo, è necessario includere i valori per queste colonne. Il primo esempio di questa figura mostra come sia possibile utilizzare una sottoquery in un'istruzione INSERT senza codificare un elenco di colonne. In questo esempio, la clausola SELECT della subquery è codificata con un asterisco, in modo che tutte le colonne della tabella InvoiceCopy siano recuperate. Quindi, dopo aver applicato la condizione di ricerca nella clausola WHERE, tutte le righe del set di risultati vengono inserite nella tabella InvoiceArchive. Il secondo esempio mostra come sia possibile utilizzare un elenco di colonne nella clausola INSERT quando si utilizza una sottoquery per recuperare le righe. Proprio come quando si usa la clausola VALUES, è possibile elencare le colonne in qualsiasi sequenza. Tuttavia, le colonne devono essere elencate nella stessa sequenza nella clausola SELECT della sottoquery. Inoltre, si possono omettere le colonne che sono definite con valori predefiniti o che consentono valori nulli. Si noti che le subquery in queste istruzioni non sono codificate tra parentesi come una subquery in un'istruzione SELECT. Questo perché non sono codificate all'interno di una una clausola dell'istruzione INSERT. Invece, sono codificate al posto della clausola VALUES. Prima di eseguire istruzioni INSERT come quelle mostrate in questa figura, occorre assicurarsi che le righe e le colonne recuperate dalla subquery siano quelle che si desidera inserire. A tale scopo, è possibile eseguire l'istruzione SELECT da sola. Poi, quando si è sicuri di aver recuperato i dati corretti, si può aggiungere la clausola INSERT per inserire le righe della tabella derivata in un'altra tabella.

La sintassi dell'istruzione INSERT per l'inserimento di righe selezionate da un'altra tabella

    SELECT column_list
    INTO table_name [(column_list)]
    FROM table_source
    [WHERE search_condition]
                

Un'istruzione INSERT che inserisce nella tabella InvoiceArchive le fatture pagate della tabella lnvoices

    USE AP
    GO
    IF object_id('InvoiceArchive', 'U') is null
        BEGIN
            SELECT *
            INTO InvoiceArchive
            FROM Invoices
            WHERE (InvoiceTotal - PaymentTotal - CreditTotal) = 0
        END
    ELSE
        BEGIN
            SET IDENTITY_INSERT InvoiceArchive ON 
            INSERT INTO InvoiceArchive
                (InvoiceID, VendorID, InvoiceNumber, InvoiceTotal, CreditTotal,
                PaymentTotal, TermsID, InvoiceDate, InvoiceDueDate)            
            SELECT
                InvoiceID, VendorID, InvoiceNumber, InvoiceTotal, CreditTotal, 
                PaymentTotal, TermsID, InvoiceDate, InvoiceDueDate
            FROM Invoices
            WHERE (InvoiceTotal - PaymentTotal - CreditTotal) = 0
            SET IDENTITY_INSERT InvoiceArchive OFF
        END
    GO
                

Descrizione

Come modificare le righe esistenti

Per modificare i dati in una o più righe di una tabella, si utilizza l'istruzione UPDATE. Sebbene la maggior parte delle istruzioni UPDATE esegua aggiornamenti semplici, come quelli che si vedono nella prossima figura, è anche possibile codificare istruzioni UPDATE più più complesse che includono subquery e join. Si apprenderanno le istruzioni complesse dopo aver imparato a eseguire un'operazione di aggiornamento di base.

Come eseguire un'operazione di aggiornamento di base

La Figura seguente presenta la sintassi dell'istruzione UPDATE. Come si può vedere negli esempi, la maggior parte delle istruzioni UPDATE include solo le clausole UPDATE, SET e WHERE. La clausola UPDATE nomina la tabella da aggiornare, la clausola SET le colonne da aggiornare e i valori da assegnare a tali colonne, e la clausola WHERE specifica la condizione che una riga deve soddisfare per essere aggiornata. Sebbene la clausola WHERE sia facoltativa, viene quasi sempre inclusa. Se non la si include, tutte le righe della tabella verranno aggiornate, il che di solito non è quello che si vuole. La prima istruzione UPDATE di questa figura modifica i valori di due colonne della tabella InvoiceCopy: PaymentDate e PaymentTotal. Poiché la clausola WHERE di questa istruzione identifica un numero di fattura specifico, verranno aggiornate solo le colonne di quella fattura. In questo esempio, si noti che i valori da assegnare alle due colonne sono codificati come letterali. È bene ricordare, tuttavia, che è possibile assegnare qualsiasi espressione valida a una colonna, a patto che il risultato sia un valore compatibile con il tipo di dati della colonna. È possibile anche usare la parola chiave NULL per assegnare un valore nullo a una colonna che consente i valori nulli, e si può usare la parola chiave DEFAULT per assegnare il valore predefinito a una colonna. La seconda istruzione UPDATE modifica una singola colonna della tabella InvoiceCopy: TermsID. Questa volta, però, la clausola WHERE specifica che tutte le righe del fornitore 95 devono essere aggiornate. Poiché questo fornitore ha sei righe nella tabella InvoiceCopy, tutte e sei le righe verranno aggiornate. La terza istruzione UPDATE illustra come si possa usare un'espressione per assegnare un valore a una colonna. In questo caso, l'espressione aumenta il valore della colonna CreditTotal di 100. Come la prima istruzione UPDATE, anche questa istruzione aggiorna una singola riga. Prima di eseguire un'istruzione UPDATE, è necessario assicurarsi di aver selezionato le righe corrette. Per farlo, si può eseguire un'istruzione SELECT con la stessa condizione di ricerca. Quindi, se l'istruzione SELECT restituisce le righe corrette, si può passare a un'istruzione UPDATE. Oltre alle clausole UPDATE, SET e WHERE, un'istruzione UPDATE può includere anche una clausola FROM. Questa clausola è un'estensione degli standard SQL, e ne vedremo l'uso nelle prossime due figure.

La sintassi dell'istruzione UPDATE

    UPDATE table_name
    SET column_name_l = expression_l [, column_name_2 - expression_2] ...
    [FROM table_source [[AS] table_alias]
    [WHERE search_condition]
                

Un'istruzione UPDATE che assegna nuovi valori a due colonne di una singola riga della tabella lnvoices

    USE AP
    GO
    UPDATE Invoices
    SET PaymentDate = '2022-12-31', PaymentTotal = 62450.25
    WHERE InvoiceNumber = '10843'
                

Un'istruzione UPDATE che assegna un nuovo valore a una colonna di tutte le fatture di un fornitore

    USE AP
    GO
    UPDATE Invoices
    SET TermsID = 1
    WHERE VendorID = 95
                

Un'istruzione di UPDATE che utilizza un'espressione aritmetica per assegnare un valore a una colonna

    USE AP
    GO
    UPDATE Invoices
    SET CreditTotal = CreditTotal + 100
    WHERE InvoiceNumber = '97/522'
                

Descrizione

Attenzione

Come utilizzare le subquery in un'operazione di aggiornamento

La Figura che segue presenta altre quattro istruzioni UPDATE che illustrano come si possono usare le subquery in un'operazione di aggiornamento. Nella prima istruzione, una sottoquery viene utilizzata nella clausola SET per recuperare la data di scadenza massima della fattura dalla tabella InvoiceCopy. Quindi, questo valore viene assegnato alla colonna InvoiceDueDate per il numero di fattura 97/522. Nella seconda istruzione, nella clausola WHERE viene utilizzata una sottoquery per identificare le fatture da aggiornare. Questa sottoquery restituisce il valore VendorID nella tabella VendorCopy con il nome "Pacific Bell". Quindi, tutte le fatture con quel valore VendorID vengono aggiornate. Anche la terza istruzione UPDATE utilizza una sottoquery nella clausola WHERE. Questa sottoquery restituisce un elenco di valori VendorID per tutti i fornitori di California, Arizona e Nevada. Quindi, si utilizza l'operatore IN per aggiornare tutte le fatture con i valori VendorID dell'elenco. Si noti che, sebbene la sottoquery restituisce 80 fornitori, molti di questi non hanno fatture. Di conseguenza, l'istruzione UPDATE riguarda solo 51 fatture. Il quarto esempio di questa figura mostra come sia possibile utilizzare una sottoquery nella clausola FROM di un'istruzione UPDATE per creare una tabella derivata. In questo caso, la tabella che contiene i valori InvoiceID delle dieci fatture con i saldi maggiori di 100 dollari. (Poiché questa istruzione UPDATE applica un credito di 100 dollari a queste fatture, non si vogliono recuperare le fatture con saldi inferiori a tale importo). Quindi, la clausola WHERE specifica che solo queste fatture devono essere aggiornate. È anche possibile utilizzare una colonna di una tabella derivata in un'espressione della clausola SET per aggiornare una colonna della tabella di base.

Un'istruzione UPDATE che assegna la data massima di scadenza nella tabella lnvoices a una fattura specifica.

    USE AP
    GO
    UPDATE Invoices
    SET CreditTotal = CreditTotal + 100,
        InvoiceDueDate = (SELECT MAX(InvoiceDueDate) FROM Invoices)
    WHERE InvoiceNumber = '97/522'
                

Un'istruzione UPDATE che aggiorna tutte le fatture di un fornitore in base al nome di quest'ultimo

    USE AP
    GO
    UPDATE Invoices
    SET TermsID = 1
    WHERE VendorID =
       (SELECT VendorID
        FROM Vendors
        WHERE VendorName = 'Pacific Bell')
                

Un'istruzione UPDATE che modifica i termini di tutte le fatture per i fornitori in tre stati

    USE AP
    GO
    UPDATE Invoices
    SET TermsID = 1
    WHERE VendorID IN
       (SELECT VendorID
        FROM Vendors
        WHERE VendorState IN ('CA', 'AZ', 'NV'))
                

Un comando UPDATE che applica un credito aggiuntivo di 100 dollari alle 3 fatture con il saldo maggiore

    USE AP
    GO
    UPDATE Invoices
    SET CreditTotal = CreditTotal + 100
    FROM
       (SELECT TOP 3 InvoiceID
        FROM Invoices
        WHERE InvoiceTotal - PaymentTotal - CreditTotal >= 100
        ORDER BY InvoiceTotal - PaymentTotal - CreditTotal DESC) AS TopInvoices
    WHERE Invoices.InvoiceID = TopInvoices.InvoiceID
                

Descrizione

Come utilizzare i join in un'operazione di aggiornamento

Oltre alle subquery, è possibile utilizzare le join nella clausola FROM di un'istruzione UPDATE. I join forniscono un modo semplice per basare un aggiornamento sui dati di una tabella diversa da quella che si sta aggiornando. I due esempi della figura illustrano come funziona. Il primo esempio in questa figura aggiorna la colonna TermsID in tutte le fatture nella tabella Invoices per il fornitore “Pacific Bell”. Questa è la stessa operazione di aggiornamento vista nel secondo esempio della figura precedente. Invece di usare una sottoquery per recuperare il valore VendorID del fornitore, questa istruzione di UPDATE unisce le tabelle Invoices e Vendors sulla colonna VendorID di ciascuna tabella. Quindi, la condizione di ricerca nella clausola WHERE utilizza la colonna VendorName della tabella Vendors per identificare le fatture da aggiornare. Il secondo esempio di questa figura mostra come si possono usare le colonne di una tabella unita alla tabella da aggiornare per specificare i valori nella clausola SET. In questo caso, la tabella Vendors è unita a una tabella denominata ContactUpdates. Come si può vedere nella figura, questa tabella include le colonne VendorID, LastName e FirstName. Dopo che le due tabelle sono state unite sulla colonna VendorID, la clausola SET utilizza le colonne LastName e FirstName della tabella ContactUpdates per aggiornare le colonne VendorContactLName e VendorContactFName nella tabella Vendors.

Un'istruzione UPDATE che modifica i termini di tutte le fatture di un fornitore

    USE AP
    GO
    UPDATE Invoices
    SET TermsID = 1
    FROM Invoices i 
        JOIN Vendors v
        ON i.VendorID = v.VendorID
    WHERE VendorName = 'Pacific Bell'
                

Descrizione

Come eliminare le righe esistenti

Per eliminare una o più righe da una tabella, si utilizza l'istruzione DELETE. Come per l'istruzione UPDATE, è possibile utilizzare subquery e join in un'istruzione DELETE per identificare le righe da eliminare. L'uso di subquery e join verrà illustrato dopo aver appreso come eseguire un'operazione di cancellazione di base.

Come eseguire un'operazione di cancellazione di base

La Figura seguente presenta la sintassi dell'istruzione DELETE e tre esempi che illustrano alcune operazioni di base di cancellazione. Come si può notare, nell'istruzione si deve specificare nella clausola DELETE il nome della tabella che contiene le righe da eliminare. È possibile inserire in questa clausola anche la parola chiave FROM, ma questa è opzionale e di solito viene omessa. Per identificare le righe da eliminare, si codifica una condizione di ricerca nella clausola WHERE. Anche se questa clausola è facoltativa, viene quasi sempre inclusa. In caso contrario, tutte le righe della tabella vengono eliminate. Questo è un errore di codifica comune e può essere disastroso. Si può anche includere una clausola FROM nell'istruzione DELETE per unire altre tabelle alla tabella di base. In seguito, si possono usare le colonne delle tabelle unite nella condizione di ricerca della clausola WHERE. La clausola FROM è un'estensione della sintassi SQL standard. Vedremo come utilizzarla nella prossima figura. La prima istruzione DELETE di questa figura cancella una singola riga dalla tabella Invoices. Per farlo, specifica il valore InvoiceID della riga da eliminare nella condizione di ricerca della clausola WHERE. La seconda istruzione è simile, ma elimina tutte le fatture con un valore di Vendor ID pari a 37. In questo caso, vengono eliminate tre righe. La terza istruzione DELETE mostra come sia possibile utilizzare un'espressione nella condizione di ricerca della clausola WHERE. In questo caso, i valori InvoiceTotal, PaymentTotal e CreditTotal vengono utilizzate per calcolare il saldo dovuto. Quindi, se il saldo dovuto è zero, la riga viene eliminata. Infine, la quarta istruzione DELETE mostra come sia facile eliminare tutte le righe da una tabella. Poiché in questa istruzione è stata omessa la clausola WHERE, tutte le righe della tabella InvoiceCopy verranno eliminate, il che probabilmente non è quello che si vuole. Poiché non è possibile ripristinare le righe una volta che sono state cancellate, è opportuno essere sicuri di aver selezionato le righe corrette. Un modo per farlo è quello di emettere un'istruzione SELECT con la stessa condizione di ricerca. Se vengono recuperate le righe corrette, si può essere certi che l'istruzione DELETE funzionerà come previsto.

La sintassi dell'istruzione DELETE

    DELETE [FROM] table_name
    [FROM table_source]
    [WHERE search_condition]
                

Un'istruzione DELETE che rimuove una singola riga dalla tabella lnvoices

    USE AP
    GO
    DELETE Invoices
    WHERE InvoiceID = 115
                

Un'istruzione DELETE che rimuove tutte le fatture per un fornitore

    USE AP
    GO
    DELETE Invoices
    WHERE VendorID = 37
                

Un'istruzione DELETE che rimuove tutte le fatture pagate.

    USE AP
    GO
    DELETE Invoices
    WHERE (InvoiceTotal - PaymentTotal - CreditTotal) = 0
                

Un'istruzione DELETE che rimuove tutte le fatture.

    USE AP
    GO
    DELETE Invoices
                

Descrizione

Attenzione

Come utilizzare le subquery e le join in un'operazione di cancellazione

Gli esempi della figura che segue illustrano come utilizzare le subquery e i join in un'istruzione DELETE. Poiché avete già visto codice simile in altre istruzioni, non dovrebbero esserci problemi a capire questi esempi. I primi due esempi cancellano tutte le fatture dalla tabella lnvoices per il fornitore chiamato "Blue Cross". Per ottenere questo risultato, il primo esempio utilizza una sottoquery nella clausola WHERE per recuperare il valore VendorID dalla tabella Vendors di questo fornitore. Il secondo esempio, invece, unisce le tabelle lnvoices e Vendors. Quindi, la clausola WHERE utilizza la colonna VendorName della tabella Vendors per identificare le righe da eliminare. La terza istruzione DELETE elimina tutti i fornitori che non hanno fatture. A tale scopo, utilizza una sottoquery per restituire un elenco dei valori VendorID nella tabella nella tabella lnvoiceCopy. Quindi, elimina tutti i fornitori che non sono presenti in questo elenco. La quarta istruzione DELETE mostra come sia possibile utilizzare la clausola FROM per unire la tabella di base indicata nella clausola DELETE con una tabella derivata. Qui, la sottoquery crea una tabella derivata basata sulla tabella lnvoiceCopy. Questa questa tabella raggruppa le fatture per fornitore e calcola l'importo totale della fattura per ogni fornitore. totale delle fatture per ciascun fornitore. Quindi, dopo che la tabella derivata è stata unita alla tabella VendorCopy, i risultati vengono filtrati in base all'importo totale della fattura. Per questo motivo questo, solo i fornitori che hanno fatture per un totale di 100 dollari o meno saranno eliminati dalla tabella VendorCopy. dalla tabella VendorCopy.

Ripopoliamo la tabella Invoices


    USE AP
    GO
    -- insert Invoices    
    SET IDENTITY_INSERT Invoices ON
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (1, 122, N'989319-457', CAST(N'2022-10-08' AS Date), 3813.3300, 3813.3300, 0.0000, 3, CAST(N'2022-11-08' AS Date), CAST(N'2022-11-07' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (2, 123, N'263253241', CAST(N'2022-10-10' AS Date), 40.2000, 40.2000, 0.0000, 3, CAST(N'2022-11-10' AS Date), CAST(N'2022-11-14' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (3, 123, N'963253234', CAST(N'2022-10-13' AS Date), 138.7500, 138.7500, 0.0000, 3, CAST(N'2022-11-13' AS Date), CAST(N'2022-11-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (4, 123, N'2-000-2993', CAST(N'2022-10-16' AS Date), 144.7000, 144.7000, 0.0000, 3, CAST(N'2022-11-16' AS Date), CAST(N'2022-11-12' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (5, 123, N'963253251', CAST(N'2022-10-16' AS Date), 15.5000, 15.5000, 0.0000, 3, CAST(N'2022-11-16' AS Date), CAST(N'2022-11-11' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (6, 123, N'963253261', CAST(N'2022-10-16' AS Date), 42.7500, 42.7500, 0.0000, 3, CAST(N'2022-11-16' AS Date), CAST(N'2022-11-21' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (7, 123, N'963253237', CAST(N'2022-10-21' AS Date), 172.5000, 172.5000, 0.0000, 3, CAST(N'2022-11-21' AS Date), CAST(N'2022-11-22' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (8, 89, N'125520-1', CAST(N'2022-10-24' AS Date), 95.0000, 95.0000, 0.0000, 1, CAST(N'2022-11-04' AS Date), CAST(N'2022-11-01' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (9, 121, N'97/488', CAST(N'2022-10-24' AS Date), 601.9500, 601.9500, 0.0000, 3, CAST(N'2022-11-24' AS Date), CAST(N'2022-11-21' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (10, 123, N'263253250', CAST(N'2022-10-24' AS Date), 42.6700, 42.6700, 0.0000, 3, CAST(N'2022-11-24' AS Date), CAST(N'2022-11-22' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (11, 123, N'963253262', CAST(N'2022-10-25' AS Date), 42.5000, 42.5000, 0.0000, 3, CAST(N'2022-11-25' AS Date), CAST(N'2022-11-20' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (12, 96, N'I77271-O01', CAST(N'2022-10-26' AS Date), 662.0000, 662.0000, 0.0000, 2, CAST(N'2022-11-16' AS Date), CAST(N'2022-11-13' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (13, 95, N'111-92R-10096', CAST(N'2022-10-30' AS Date), 16.3300, 16.3300, 0.0000, 2, CAST(N'2022-11-20' AS Date), CAST(N'2022-11-23' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (14, 115, N'25022117', CAST(N'2022-11-01' AS Date), 6.0000, 6.0000, 0.0000, 4, CAST(N'2022-12-10' AS Date), CAST(N'2022-12-10' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (15, 48, N'P02-88D77S7', CAST(N'2022-11-03' AS Date), 856.9200, 856.9200, 0.0000, 3, CAST(N'2022-12-02' AS Date), CAST(N'2022-11-30' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (16, 97, N'21-4748363', CAST(N'2022-11-03' AS Date), 9.9500, 9.9500, 0.0000, 2, CAST(N'2022-11-23' AS Date), CAST(N'2022-11-22' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (17, 123, N'4-321-2596', CAST(N'2022-11-05' AS Date), 10.0000, 10.0000, 0.0000, 3, CAST(N'2022-12-04' AS Date), CAST(N'2022-12-05' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (18, 123, N'963253242', CAST(N'2022-11-06' AS Date), 104.0000, 104.0000, 0.0000, 3, CAST(N'2022-12-05' AS Date), CAST(N'2022-12-05' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (19, 34, N'QP58872', CAST(N'2022-11-07' AS Date), 116.5400, 116.5400, 0.0000, 1, CAST(N'2022-11-17' AS Date), CAST(N'2022-11-19' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (20, 115, N'24863706', CAST(N'2022-11-10' AS Date), 6.0000, 6.0000, 0.0000, 4, CAST(N'2022-12-19' AS Date), CAST(N'2022-12-15' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (21, 119, N'10843', CAST(N'2022-11-11' AS Date), 4901.2600, 4901.2600, 0.0000, 2, CAST(N'2022-11-30' AS Date), CAST(N'2022-11-29' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (22, 123, N'963253235', CAST(N'2022-11-11' AS Date), 108.2500, 108.2500, 0.0000, 3, CAST(N'2022-12-10' AS Date), CAST(N'2022-12-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (23, 97, N'21-4923721', CAST(N'2022-11-13' AS Date), 9.9500, 9.9500, 0.0000, 2, CAST(N'2022-12-02' AS Date), CAST(N'2022-11-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (24, 113, N'77290', CAST(N'2022-11-13' AS Date), 1750.0000, 1750.0000, 0.0000, 5, CAST(N'2023-01-02' AS Date), CAST(N'2023-01-05' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (25, 123, N'963253246', CAST(N'2022-11-13' AS Date), 129.0000, 129.0000, 0.0000, 3, CAST(N'2022-12-12' AS Date), CAST(N'2022-12-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (26, 123, N'4-342-8069', CAST(N'2022-11-14' AS Date), 10.0000, 10.0000, 0.0000, 3, CAST(N'2022-12-13' AS Date), CAST(N'2022-12-13' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (27, 88, N'972110', CAST(N'2022-11-15' AS Date), 207.7800, 207.7800, 0.0000, 1, CAST(N'2022-11-25' AS Date), CAST(N'2022-11-27' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (28, 123, N'963253263', CAST(N'2022-11-16' AS Date), 109.5000, 109.5000, 0.0000, 3, CAST(N'2022-12-15' AS Date), CAST(N'2022-12-10' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (29, 108, N'121897', CAST(N'2022-11-19' AS Date), 450.0000, 450.0000, 0.0000, 4, CAST(N'2022-12-28' AS Date), CAST(N'2023-01-03' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (30, 123, N'1-200-5164', CAST(N'2022-11-20' AS Date), 63.4000, 63.4000, 0.0000, 3, CAST(N'2022-12-19' AS Date), CAST(N'2022-12-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (31, 104, N'P02-3772', CAST(N'2022-11-21' AS Date), 7125.3400, 7125.3400, 0.0000, 3, CAST(N'2022-12-20' AS Date), CAST(N'2022-12-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (32, 121, N'97/486', CAST(N'2022-11-21' AS Date), 953.1000, 953.1000, 0.0000, 3, CAST(N'2022-12-20' AS Date), CAST(N'2022-12-22' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (33, 105, N'94007005', CAST(N'2022-11-23' AS Date), 220.0000, 220.0000, 0.0000, 3, CAST(N'2022-12-22' AS Date), CAST(N'2022-12-26' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (34, 123, N'963253232', CAST(N'2022-11-23' AS Date), 127.7500, 127.7500, 0.0000, 3, CAST(N'2022-12-22' AS Date), CAST(N'2022-12-18' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (35, 107, N'RTR-72-3662-X', CAST(N'2022-11-25' AS Date), 1600.0000, 1600.0000, 0.0000, 4, CAST(N'2023-01-04' AS Date), CAST(N'2023-01-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (36, 121, N'97/465', CAST(N'2022-11-25' AS Date), 565.1500, 565.1500, 0.0000, 3, CAST(N'2022-12-24' AS Date), CAST(N'2022-12-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (37, 123, N'963253260', CAST(N'2022-11-25' AS Date), 36.0000, 36.0000, 0.0000, 3, CAST(N'2022-12-24' AS Date), CAST(N'2022-12-26' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (38, 123, N'963253272', CAST(N'2022-11-26' AS Date), 61.5000, 61.5000, 0.0000, 3, CAST(N'2022-12-25' AS Date), CAST(N'2022-12-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (39, 110, N'0-2058', CAST(N'2022-11-28' AS Date), 37966.1900, 37966.1900, 0.0000, 3, CAST(N'2022-12-27' AS Date), CAST(N'2022-12-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (40, 121, N'97/503', CAST(N'2022-11-30' AS Date), 639.7700, 639.7700, 0.0000, 3, CAST(N'2022-12-28' AS Date), CAST(N'2022-12-25' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (41, 123, N'963253255', CAST(N'2022-11-30' AS Date), 53.7500, 53.7500, 0.0000, 3, CAST(N'2022-12-28' AS Date), CAST(N'2022-12-27' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (42, 123, N'94007069', CAST(N'2022-11-30' AS Date), 400.0000, 400.0000, 0.0000, 3, CAST(N'2022-12-28' AS Date), CAST(N'2023-01-01' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (43, 72, N'40318', CAST(N'2022-12-01' AS Date), 21842.0000, 21842.0000, 0.0000, 3, CAST(N'2023-01-01' AS Date), CAST(N'2022-12-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (44, 95, N'111-92R-10094', CAST(N'2022-12-01' AS Date), 19.6700, 19.6700, 0.0000, 2, CAST(N'2022-12-21' AS Date), CAST(N'2022-12-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (45, 122, N'989319-437', CAST(N'2022-12-01' AS Date), 2765.3600, 2765.3600, 0.0000, 3, CAST(N'2023-01-01' AS Date), CAST(N'2022-12-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (46, 37, N'547481328', CAST(N'2022-12-03' AS Date), 224.0000, 224.0000, 0.0000, 3, CAST(N'2023-01-03' AS Date), CAST(N'2023-01-04' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (47, 83, N'31359783', CAST(N'2022-12-03' AS Date), 1575.0000, 1575.0000, 0.0000, 2, CAST(N'2022-12-23' AS Date), CAST(N'2022-12-21' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (48, 123, N'1-202-2978', CAST(N'2022-12-03' AS Date), 33.0000, 33.0000, 0.0000, 3, CAST(N'2023-01-03' AS Date), CAST(N'2023-01-05' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (49, 95, N'111-92R-10097', CAST(N'2022-12-04' AS Date), 16.3300, 16.3300, 0.0000, 2, CAST(N'2022-12-24' AS Date), CAST(N'2022-12-26' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (50, 37, N'547479217', CAST(N'2022-12-07' AS Date), 116.0000, 116.0000, 0.0000, 3, CAST(N'2023-01-07' AS Date), CAST(N'2023-01-07' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (51, 122, N'989319-477', CAST(N'2022-12-08' AS Date), 2184.1100, 2184.1100, 0.0000, 3, CAST(N'2023-01-08' AS Date), CAST(N'2023-01-08' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (52, 34, N'Q545443', CAST(N'2022-12-09' AS Date), 1083.5800, 1083.5800, 0.0000, 1, CAST(N'2022-12-19' AS Date), CAST(N'2022-12-23' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (53, 95, N'111-92R-10092', CAST(N'2022-12-09' AS Date), 46.2100, 46.2100, 0.0000, 2, CAST(N'2022-12-28' AS Date), CAST(N'2023-01-02' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (54, 121, N'97/553B', CAST(N'2022-12-10' AS Date), 313.5500, 313.5500, 0.0000, 3, CAST(N'2023-01-10' AS Date), CAST(N'2023-01-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (55, 123, N'963253245', CAST(N'2022-12-10' AS Date), 40.7500, 40.7500, 0.0000, 3, CAST(N'2023-01-10' AS Date), CAST(N'2023-01-12' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (56, 86, N'367447', CAST(N'2022-12-11' AS Date), 2433.0000, 2433.0000, 0.0000, 1, CAST(N'2022-12-21' AS Date), CAST(N'2022-12-17' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (57, 103, N'75C-90227', CAST(N'2022-12-11' AS Date), 1367.5000, 1367.5000, 0.0000, 5, CAST(N'2023-01-31' AS Date), CAST(N'2023-01-31' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (58, 123, N'963253256', CAST(N'2022-12-11' AS Date), 53.2500, 53.2500, 0.0000, 3, CAST(N'2023-01-11' AS Date), CAST(N'2023-01-07' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (59, 123, N'4-314-3057', CAST(N'2022-12-11' AS Date), 13.7500, 13.7500, 0.0000, 3, CAST(N'2023-01-11' AS Date), CAST(N'2023-01-15' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (60, 122, N'989319-497', CAST(N'2022-12-12' AS Date), 2312.2000, 2312.2000, 0.0000, 3, CAST(N'2023-01-12' AS Date), CAST(N'2023-01-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (61, 115, N'24946731', CAST(N'2022-12-15' AS Date), 25.6700, 25.6700, 0.0000, 4, CAST(N'2023-01-25' AS Date), CAST(N'2023-01-26' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (62, 123, N'963253269', CAST(N'2022-12-15' AS Date), 26.7500, 26.7500, 0.0000, 3, CAST(N'2023-01-15' AS Date), CAST(N'2023-01-11' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (63, 122, N'989319-427', CAST(N'2022-12-16' AS Date), 2115.8100, 2115.8100, 0.0000, 3, CAST(N'2023-01-16' AS Date), CAST(N'2023-01-19' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (64, 123, N'963253267', CAST(N'2022-12-17' AS Date), 23.5000, 23.5000, 0.0000, 3, CAST(N'2023-01-17' AS Date), CAST(N'2023-01-19' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (65, 99, N'509786', CAST(N'2022-12-18' AS Date), 6940.2500, 6940.2500, 0.0000, 3, CAST(N'2023-01-18' AS Date), CAST(N'2023-01-15' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (66, 123, N'263253253', CAST(N'2022-12-18' AS Date), 31.9500, 31.9500, 0.0000, 3, CAST(N'2023-01-18' AS Date), CAST(N'2023-01-21' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (67, 122, N'989319-487', CAST(N'2022-12-20' AS Date), 1927.5400, 1927.5400, 0.0000, 3, CAST(N'2023-01-20' AS Date), CAST(N'2023-01-18' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (68, 81, N'MABO1489', CAST(N'2022-12-21' AS Date), 936.9300, 936.9300, 0.0000, 2, CAST(N'2023-01-11' AS Date), CAST(N'2023-01-10' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (69, 80, N'133560', CAST(N'2022-12-22' AS Date), 175.0000, 175.0000, 0.0000, 2, CAST(N'2023-01-12' AS Date), CAST(N'2023-01-16' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (70, 115, N'24780512', CAST(N'2022-12-22' AS Date), 6.0000, 6.0000, 0.0000, 4, CAST(N'2023-02-01' AS Date), CAST(N'2023-01-29' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (71, 123, N'963253254', CAST(N'2022-12-22' AS Date), 108.5000, 108.5000, 0.0000, 3, CAST(N'2023-01-22' AS Date), CAST(N'2023-01-20' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (72, 123, N'43966316', CAST(N'2022-12-22' AS Date), 10.0000, 10.0000, 0.0000, 3, CAST(N'2023-01-22' AS Date), CAST(N'2023-01-17' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (73, 114, N'CBM9920-M-T77109', CAST(N'2022-12-23' AS Date), 290.0000, 290.0000, 0.0000, 1, CAST(N'2023-01-03' AS Date), CAST(N'2022-12-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (74, 102, N'109596', CAST(N'2022-12-24' AS Date), 41.8000, 41.8000, 0.0000, 4, CAST(N'2023-02-03' AS Date), CAST(N'2023-02-04' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (75, 123, N'7548906-20', CAST(N'2022-12-24' AS Date), 27.0000, 27.0000, 0.0000, 3, CAST(N'2023-01-24' AS Date), CAST(N'2023-01-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (76, 123, N'963253248', CAST(N'2022-12-24' AS Date), 241.0000, 241.0000, 0.0000, 3, CAST(N'2023-01-24' AS Date), CAST(N'2023-01-25' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (77, 121, N'97/553', CAST(N'2022-12-25' AS Date), 904.1400, 904.1400, 0.0000, 3, CAST(N'2023-01-25' AS Date), CAST(N'2023-01-25' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (78, 121, N'97/522', CAST(N'2022-12-28' AS Date), 1962.1300, 1762.1300, 200.0000, 3, CAST(N'2023-01-28' AS Date), CAST(N'2023-01-30' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (79, 100, N'587056', CAST(N'2022-12-28' AS Date), 2184.5000, 2184.5000, 0.0000, 4, CAST(N'2023-02-09' AS Date), CAST(N'2023-02-07' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (80, 122, N'989319-467', CAST(N'2023-01-01' AS Date), 2318.0300, 2318.0300, 0.0000, 3, CAST(N'2023-01-31' AS Date), CAST(N'2023-01-29' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (81, 123, N'263253265', CAST(N'2023-01-02' AS Date), 26.2500, 26.2500, 0.0000, 3, CAST(N'2023-02-01' AS Date), CAST(N'2023-01-28' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (82, 94, N'203339-13', CAST(N'2023-01-05' AS Date), 17.5000, 17.5000, 0.0000, 2, CAST(N'2023-01-25' AS Date), CAST(N'2023-01-27' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (83, 95, N'111-92R-10093', CAST(N'2023-01-06' AS Date), 39.7700, 39.7700, 0.0000, 2, CAST(N'2023-01-26' AS Date), CAST(N'2023-01-22' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (84, 123, N'963253258', CAST(N'2023-01-06' AS Date), 111.0000, 111.0000, 0.0000, 3, CAST(N'2023-02-05' AS Date), CAST(N'2023-02-05' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (85, 123, N'963253271', CAST(N'2023-01-07' AS Date), 158.0000, 158.0000, 0.0000, 3, CAST(N'2023-02-06' AS Date), CAST(N'2023-02-11' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (86, 123, N'963253230', CAST(N'2023-01-07' AS Date), 739.2000, 739.2000, 0.0000, 3, CAST(N'2023-02-06' AS Date), CAST(N'2023-02-06' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (87, 123, N'963253244', CAST(N'2023-01-08' AS Date), 60.0000, 60.0000, 0.0000, 3, CAST(N'2023-02-07' AS Date), CAST(N'2023-02-09' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (88, 123, N'963253239', CAST(N'2023-01-08' AS Date), 147.2500, 147.2500, 0.0000, 3, CAST(N'2023-02-07' AS Date), CAST(N'2023-02-11' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (89, 72, N'39104', CAST(N'2023-01-10' AS Date), 85.3100, 0.0000, 0.0000, 3, CAST(N'2023-02-09' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (90, 123, N'963253252', CAST(N'2023-01-12' AS Date), 38.7500, 38.7500, 0.0000, 3, CAST(N'2023-02-11' AS Date), CAST(N'2023-02-11' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (91, 95, N'111-92R-10095', CAST(N'2023-01-15' AS Date), 32.7000, 32.7000, 0.0000, 2, CAST(N'2023-02-04' AS Date), CAST(N'2023-02-06' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (92, 117, N'111897', CAST(N'2023-01-15' AS Date), 16.6200, 16.6200, 0.0000, 3, CAST(N'2023-02-14' AS Date), CAST(N'2023-02-14' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (93, 123, N'4-327-7357', CAST(N'2023-01-16' AS Date), 162.7500, 162.7500, 0.0000, 3, CAST(N'2023-02-15' AS Date), CAST(N'2023-02-11' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (94, 123, N'963253264', CAST(N'2023-01-18' AS Date), 52.2500, 0.0000, 0.0000, 3, CAST(N'2023-02-17' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (95, 82, N'C73-24', CAST(N'2023-01-19' AS Date), 600.0000, 600.0000, 0.0000, 2, CAST(N'2023-02-08' AS Date), CAST(N'2023-02-13' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (96, 110, N'P-0259', CAST(N'2023-01-19' AS Date), 26881.4000, 26881.4000, 0.0000, 3, CAST(N'2023-02-18' AS Date), CAST(N'2023-02-20' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (97, 90, N'97-1024A', CAST(N'2023-01-20' AS Date), 356.4800, 356.4800, 0.0000, 2, CAST(N'2023-02-09' AS Date), CAST(N'2023-02-07' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (98, 83, N'31361833', CAST(N'2023-01-21' AS Date), 579.4200, 0.0000, 0.0000, 2, CAST(N'2023-02-10' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (99, 123, N'263253268', CAST(N'2023-01-21' AS Date), 59.9700, 0.0000, 0.0000, 3, CAST(N'2023-02-20' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (100, 123, N'263253270', CAST(N'2023-01-22' AS Date), 67.9200, 0.0000, 0.0000, 3, CAST(N'2023-02-21' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (101, 123, N'263253273', CAST(N'2023-01-22' AS Date), 30.7500, 0.0000, 0.0000, 3, CAST(N'2023-02-21' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (102, 110, N'P-0608', CAST(N'2023-01-23' AS Date), 20551.1800, 0.0000, 1200.0000, 3, CAST(N'2023-02-22' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (103, 122, N'989319-417', CAST(N'2023-01-23' AS Date), 2051.5900, 2051.5900, 0.0000, 3, CAST(N'2023-02-22' AS Date), CAST(N'2023-02-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (104, 123, N'263253243', CAST(N'2023-01-23' AS Date), 44.4400, 44.4400, 0.0000, 3, CAST(N'2023-02-22' AS Date), CAST(N'2023-02-24' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (105, 106, N'9982771', CAST(N'2023-01-24' AS Date), 503.2000, 0.0000, 0.0000, 3, CAST(N'2023-02-23' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (106, 110, N'0-2060', CAST(N'2023-01-24' AS Date), 23517.5800, 21221.6300, 2295.9500, 3, CAST(N'2023-02-23' AS Date), CAST(N'2023-02-27' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (107, 122, N'989319-447', CAST(N'2023-01-24' AS Date), 3689.9900, 3689.9900, 0.0000, 3, CAST(N'2023-02-23' AS Date), CAST(N'2023-02-19' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (108, 123, N'963253240', CAST(N'2023-01-24' AS Date), 67.0000, 67.0000, 0.0000, 3, CAST(N'2023-02-23' AS Date), CAST(N'2023-02-23' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (109, 121, N'97/222', CAST(N'2023-01-25' AS Date), 1000.4600, 1000.4600, 0.0000, 3, CAST(N'2023-02-24' AS Date), CAST(N'2023-02-22' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (110, 80, N'134116', CAST(N'2023-01-28' AS Date), 90.3600, 0.0000, 0.0000, 2, CAST(N'2023-02-17' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (111, 123, N'263253257', CAST(N'2023-01-30' AS Date), 22.5700, 22.5700, 0.0000, 3, CAST(N'2023-03-01' AS Date), CAST(N'2023-03-03' AS Date))
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (112, 110, N'0-2436', CAST(N'2023-01-31' AS Date), 10976.0600, 0.0000, 0.0000, 3, CAST(N'2023-03-01' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (113, 37, N'547480102', CAST(N'2023-02-01' AS Date), 224.0000, 0.0000, 0.0000, 3, CAST(N'2023-03-01' AS Date), NULL)
    INSERT Invoices (InvoiceID, VendorID, InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDueDate, PaymentDate) VALUES (114, 123, N'963253249', CAST(N'2023-02-02' AS Date), 127.7500, 127.7500, 0.0000, 3, CAST(N'2023-03-01' AS Date), CAST(N'2023-03-04' AS Date))

    SET IDENTITY_INSERT Invoices OFF
                

Un'istruzione DELETE che cancella tutte le fatture di un fornitore in base al nome di quest'ultimo

    USE AP
    GO
    DELETE Invoices
    WHERE VendorID IN
        (SELECT VendorID
        FROM Vendors 
        WHERE VendorName = 'Blue Cross')
                

La stessa istruzione DELETE utilizzando un join

    USE AP
    GO
    DELETE Invoices
    FROM Invoices i
        JOIN Vendors v
        ON i.VendorID = v.VendorID
    WHERE VendorName = 'Blue Cross'
                

Un'istruzione DELETE che elimina i fornitori che non hanno fatture.

    USE AP
    GO
    DELETE Vendors
    WHERE VendorID NOT IN 
        (SELECT DISTINCT VendorID FROM Invoices)
                

Un'istruzione DELETE che elimina i fornitori le cui fatture non superano i 100 dollari.

    USE AP
    GO                    
    DELETE Invoices
    FROM Invoices i
        JOIN 
            (SELECT VendorID, SUM(InvoiceTotal) AS TotalOfInvoices
            FROM Invoices
            GROUP BY VendorID) AS s
        ON i.VendorID = s.VendorID
    WHERE TotalOfInvoices <= 100
                

Descrizione

Come unire le righe

SQL Server 2008 ha introdotto un'istruzione MERGE che consente di unire più righe da una tabella a un'altra tabella. Poiché questa operazione comporta in genere l'aggiornamento delle righe esistenti e l'inserimento di nuove righe, l'istruzione MERGE viene talvolta chiamata come istruzione upsert.

Come eseguire un'operazione di fusione di base

La Figura che segue presenta la sintassi dell'istruzione MERGE e un esempio che ne illustra il funzionamento. Per iniziare, si codifica la parola chiave MERGE, seguita dalla parola chiave opzionale INTO e dalla tabella di destinazione. In questo esempio, la tabella di destinazione è la tabella InvoiceArchive, con l'alias ia. Dopo la clausola MERGE, si inserisce la parola chiave USING seguita dalla tabella di origine. In questo esempio, la tabella di origine è la tabella Invoices e ha l'alias ic. Dopo la clausola USING, si codifica una clausola ON che specifica la condizione che viene utilizzata per unire le due tabelle. In questa figura, entrambe le tabelle utilizzano la colonna InvoiceID come chiave primaria e la clausola ON unisce le tabelle su questa colonna. Tuttavia, se necessario, è possibile codificare condizioni di unione più complesse. Dopo la clausola USING, è possibile codificare una o più clausole WHEN che controllano quando una riga viene inserita o aggiornata o cancellata. In questa figura, ad esempio, la prima clausola WHEN controlla se (a) i valori di InvoiceID sono corrispondenti, (b) la colonna PaymentDate della tabella Invoices non è un valore NULL, (c) la colonna PaymentTotal della tabella Invoices è maggiore della colonna PaymentTotal della tabella Invoices. In questo caso, la seconda e la terza impediscono l'aggiornamento di tutte le righe con un InvoiceID corrispondente. Se tutte e tre le condizioni sono vere, questa clausola WHEN aggiorna le colonne della tabella InvoiceArchive con i valori corrispondenti nella tabella Invoices. Per farlo, il codice utilizza gli alias delle tabelle per qualificare i nomi delle colonne. La seconda clausola WHEN controlla se i valori InvoiceID non sono abbinati. Se inserisce la riga nella tabella InvoiceArchive. A tale scopo, il codice utilizza l'alias della tabella Invoices per qualificare ogni nome di colonna. Infine, per segnalare la fine di un'istruzione MERGE, è necessario inserire nel codice un punto e virgola (;). In caso contrario, si otterrà un errore quando si tenterà di eseguirla.

Come codificare operazioni di fusione più complesse

L'esempio di questa figura mostra un uso tipico dell'istruzione MERGE. Tuttavia, è possibile utilizzare l'istruzione MERGE anche per eliminare le righe nella tabella di destinazione che non trovano corrispondenza nella tabella di origine. A tale scopo, è possibile aggiungere una clausola WHEN come la terza in questa figura. Inoltre, l'istruzione MERGE supporta altre funzionalità più complesse, come la clausola TOP. Per ulteriori informazioni, è possibile consultare l'istruzione MERGE nella documentazione di SQL Server.

La sintassi dell'istruzione MERGE

    MERGE [INTO] table_target
    USING table_source
    ON join_condition
    [WHEN MATCHED [AND search_condition] ...
    THEN dml_statement ]
    [WHEN NOT MATCHED [BY TARGET ] [AND search_condition] ...
    THEN dml_statement ]
    [WHEN NOT MATCHED BY SOURCE [AND search_condition] ...
    THEN dml_statement ]
    ;
                

Un'istruzione MERGE che inserisce e aggiorna le righe

USE AP GO SET IDENTITY_INSERT InvoiceArchive ON MERGE INTO InvoiceArchive AS ia USING Invoices AS i ON i.InvoiceID = ia.InvoiceID WHEN MATCHED AND i.PaymentDate IS NOT NULL AND i.PaymentTotal > ia.PaymentTotal THEN UPDATE SET ia.PaymentTotal = i.PaymentTotal, ia.CreditTotal = i.CreditTotal, ia.PaymentDate = i.PaymentDate WHEN NOT MATCHED THEN INSERT (InvoiceID, VendorID, InvoiceNumber, InvoiceTotal, PaymentTotal, CreditTotal, TermsID, InvoiceDate, InvoiceDueDate) VALUES (i.InvoiceID, i.VendorID, i.InvoiceNumber, c.InvoiceTotal, i.PaymentTotal, i.CreditTotal, i.TermsID, i.InvoiceDate, i.InvoiceDueDate) WHEN NOT MATCHED BY SOURCE THEN DELETE SET IDENTITY_INSERT InvoiceArchive OFF ;

Un'istruzione MERGE che inserisce e aggiorna le righe

    USE AP
    GO
    -- STEP 1: run the script in figure before
    -- it should merge all rows in the Invoices table
    -- into the InvoiceArchive table
    
    -- STEP 2: run this script
    
    -- insert a row
    INSERT INTO Invoices
    VALUES (3, 'P29381', '2023-03-01', 50.20, 0, 0, 1, '2023-03-31', NULL);
    
    -- update a row
    UPDATE Invoices
    SET PaymentDate = '2023-03-21', 
        PaymentTotal = 579.42
    WHERE InvoiceID = 114;
    
    -- STEP 3: run the script in figure again
    -- it should only insert and update the two rows shown in this script
                

Descrizione

Prospettiva

In questa lezione si è appreso come utilizzare le istruzioni INSERT, UPDATE e DELETE per modificare i dati di un database. Se volete esercitarvi nell'uso di queste istruzioni, utilizzate una delle due opzioni presentate all'inizio di questa lezione, per evitare di danneggiare un database attivo o un database condiviso da altri. Se si elimina una riga in una tabella Vendors che ha righe correlate in una tabella Invoices, SQL Server può eliminare tutte le righe correlate in una tabella Invoices. Ma questo dipende da come è definita la relazione. È necessario sapere che SQL Server 2005 e successivi consentono di utilizzare la clausola TOP con le istruzioni INSERT, UPDATE e DELETE per limitare il numero di righe inserite, aggiornate o eliminate. Il funzionamento è simile all'uso della clausola TOP con un'istruzione SELECT, come descritto nella lezione3. Per i dettagli di codifica, potete cercare "TOP clause" nella documentazione di SQL Server.


Esercizi

Se non diversamente indicato, utilizzare la sintassi di unione esplicita

    USE AP
    GO
    IF OBJECT_ID('InvoiceCopy') IS NOT NULL
        DROP TABLE InvoiceCopy
    GO    
    SELECT *
    INTO InvoiceCopy
    FROM Invoices;

    IF OBJECT_ID('VendorCopy') IS NOT NULL
    DROP TABLE VendorCopy
    GO
    SELECT *
    INTO VendorCopy
    FROM Vendors;
                          

    USE AP
    GO
    INSERT InvoiceCopy
    VALUES (32, 'AX-014-027', '2025-04-03', 434.58, 0, 0, 2, '2025-05-03', NULL);
                          

    USE AP
    GO
    INSERT VendorCopy
    SELECT VendorName, VendorAddress1, VendorAddress2,
           VendorCity, VendorState, VendorZipCode,
           VendorPhone, VendorContactLName, VendorContactFName,
           DefaultTermsID, DefaultAccountNo
    FROM Vendors
    WHERE VendorState <> 'CA'
                          

    USE AP
    GO
    UPDATE VendorCopy
    SET DefaultAccountNo = 403
    WHERE DefaultAccountNo = 400
                          

    USE AP
    GO
    UPDATE InvoiceCopy
    SET PaymentDate = GETDATE(),
        PaymentTotal = (InvoiceTotal - CreditTotal)
    WHERE (InvoiceTotal - CreditTotal - PaymentTotal) > 0
                          

    USE AP
    GO
    UPDATE InvoiceCopy
    SET TermsID = 2
    WHERE VendorID IN
        (SELECT VendorID
         FROM Vendors
         WHERE DefaultTermsID = 2)
                          

    USE AP
    GO
    UPDATE InvoiceCopy
    SET TermsID = 2
    FROM Invoices i 
      JOIN Vendors v
        ON i.VendorID = v.VendorID
    WHERE DefaultTermsID = 2
                          

    USE AP
    GO
    DELETE VendorCopy
    WHERE VendorState = 'MN'
                          

    USE AP
    GO
    DELETE VendorCopy
    WHERE VendorState NOT IN
      (SELECT DISTINCT VendorState
       FROM Vendors v
         JOIN Invoices i
           ON v.VendorID = i.VendorID)

    -- with CTE
    USE AP
    GO
    WITH StatiFatture AS
    (
        SELECT DISTINCT vc.VendorState
        FROM VendorCopy AS vc JOIN InvoiceCopy AS ic
        ON vc.VendorID = ic.VendorID
    )
    DELETE VendorCopy
    WHERE VendorState NOT IN (SELECT VendorState FROM StatiFatture)
                          
Per visualizzare le soluzioni degli esercizi devi inserire la password fornita dal docente