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.
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.
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.
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]
USE AP
GO
SELECT *
INTO InvoiceCopy
FROM Invoices
USE AP
GO
SELECT *
INTO OldInvoices
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) = 0
USE AP
GO
SELECT VendorID, SUM(InvoiceTotal) AS SumOfInvoices
INTO VendorBalances
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) <> 0
GROUP BY VendorID
USE AP
GO
SELECT *
FROM VendorBalances
USE AP
GO
DROP TABLE InvoiceCopy
Per aggiungere nuove righe a una tabella, si utilizza l'istruzione INSERT. Questa istruzione consente di inserire una singola riga o più righe.
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.
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.
INSERT [INTO] table_name [ ( column_list ) ]
[DEFAULT] VALUES (expression_l [, expression_2] ... )
[, ( expression_l [, expression_2] ... ) ... ]
Colonna | Valore |
---|---|
Invoice ID | (Next available unique ID) |
VendorID | 97 |
InvoiceNumber | 456789 |
InvoiceDate | 25/12/2022 |
InvoiceTotal | 8,344.50 |
Payment Total | 0 |
CreditTotal | 0 |
Terms ID | 1 |
InvoiceDueDate | 25/01/2023 |
PaymentDate | NULL |
USE AP
GO
INSERT INTO Invoices
VALUES (97, '456789','2022-12-25', 8344.50, 0, 0, 1, '2023-01-25', NULL)
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')
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)
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.
Nome della colonna | Tipo di dati | Lunghezza | Identità | Consente valori nulli | Valore predefinito |
---|---|---|---|---|---|
ID | Int | 4 | Sì | No | No |
ColorNumber | Int | 4 | No | No | 0 |
ColorName | VarChar | 10 | No | Sì | No |
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
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;
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.
SELECT column_list
INTO table_name [(column_list)]
FROM table_source
[WHERE search_condition]
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
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.
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.
UPDATE table_name
SET column_name_l = expression_l [, column_name_2 - expression_2] ...
[FROM table_source [[AS] table_alias]
[WHERE search_condition]
USE AP
GO
UPDATE Invoices
SET PaymentDate = '2022-12-31', PaymentTotal = 62450.25
WHERE InvoiceNumber = '10843'
USE AP
GO
UPDATE Invoices
SET TermsID = 1
WHERE VendorID = 95
USE AP
GO
UPDATE Invoices
SET CreditTotal = CreditTotal + 100
WHERE InvoiceNumber = '97/522'
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.
USE AP
GO
UPDATE Invoices
SET CreditTotal = CreditTotal + 100,
InvoiceDueDate = (SELECT MAX(InvoiceDueDate) FROM Invoices)
WHERE InvoiceNumber = '97/522'
USE AP
GO
UPDATE Invoices
SET TermsID = 1
WHERE VendorID =
(SELECT VendorID
FROM Vendors
WHERE VendorName = 'Pacific Bell')
USE AP
GO
UPDATE Invoices
SET TermsID = 1
WHERE VendorID IN
(SELECT VendorID
FROM Vendors
WHERE VendorState IN ('CA', 'AZ', 'NV'))
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
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.
USE AP
GO
UPDATE Invoices
SET TermsID = 1
FROM Invoices i
JOIN Vendors v
ON i.VendorID = v.VendorID
WHERE VendorName = 'Pacific Bell'
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.
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.
DELETE [FROM] table_name
[FROM table_source]
[WHERE search_condition]
USE AP
GO
DELETE Invoices
WHERE InvoiceID = 115
USE AP
GO
DELETE Invoices
WHERE VendorID = 37
USE AP
GO
DELETE Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) = 0
USE AP
GO
DELETE Invoices
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.
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
USE AP
GO
DELETE Invoices
WHERE VendorID IN
(SELECT VendorID
FROM Vendors
WHERE VendorName = 'Blue Cross')
USE AP
GO
DELETE Invoices
FROM Invoices i
JOIN Vendors v
ON i.VendorID = v.VendorID
WHERE VendorName = 'Blue Cross'
USE AP
GO
DELETE Vendors
WHERE VendorID NOT IN
(SELECT DISTINCT VendorID FROM Invoices)
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
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.
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.
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.
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 ]
;
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
;
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
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.
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)