Esempi di istruzioni SELECT (Transact-SQL)
In questo argomento sono inclusi alcuni esempi relativi all'utilizzo dell'istruzione SELECT.
A. Utilizzo dell'istruzione SELECT per il recupero di righe e colonne
Nell'esempio seguente vengono illustrati tre blocchi di codice. Nel primo esempio di codice vengono restituite tutte le righe (clausola WHERE omessa) e tutte le colonne (utilizzando *) della tabella Product del database AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2008R2;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
Nell'esempio seguente vengono restituite tutte le righe (clausola WHERE omessa) e solo un subset delle colonne (Name, ProductNumber, ListPrice) della tabella Product del database AdventureWorks2008R2. Viene aggiunta, inoltre, un'intestazione di colonna.
USE AdventureWorks2008R2;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
Nell'esempio seguente vengono restituite solo le righe della tabella Product caratterizzate da una riga di prodotto R e da un numero di giorni per l'invio in produzione minore di 4.
USE AdventureWorks2008R2;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
B. Utilizzo dell'istruzione SELECT con intestazioni e calcoli di colonna
Nell'esempio seguente vengono restituite tutte le righe della tabella Product. Nel primo esempio vengono restituite le vendite totali e gli sconti per ogni prodotto. Nel secondo esempio vengono calcolati i ricavi totali per ogni prodotto.
USE AdventureWorks2008R2;
GO
SELECT p.Name AS ProductName,
NonDiscountSales = (OrderQty * UnitPrice),
Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName DESC;
GO
Questa è la query che calcola il ricavo per ogni prodotto di ogni ordine di vendita.
USE AdventureWorks2008R2;
GO
SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)), ' for ',
p.Name AS ProductName
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC;
GO
C. Utilizzo della clausola DISTINCT con l'istruzione SELECT
Nell'esempio seguente viene utilizzata la clausola DISTINCT per evitare il recupero di titoli duplicati.
USE AdventureWorks2008R2;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Creazione di tabelle con l'istruzione SELECT INTO
Nel primo esempio seguente viene creata una tabella temporanea denominata #Bicycles in tempdb.
USE tempdb;
GO
IF OBJECT_ID (N'#Bicycles',N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO
SELECT *
INTO #Bicycles
FROM AdventureWorks2008R2.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
Nel secondo esempio viene creata la tabella permanente NewProducts.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY BULK_LOGGED;
GO
SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY FULL;
GO
E. Utilizzo di sottoquery correlate
Nell'esempio seguente vengono illustrate query semanticamente equivalenti e viene evidenziata la differenza tra la parola chiave EXISTS e la parola chiave IN. Entrambi sono esempi di sottoquery valide che recuperano un'istanza del nome di ogni prodotto del modello "Long-sleeve logo jersey" e con valori ProductModelID uguali nelle tabelle Product e ProductModel.
USE AdventureWorks2008R2;
GO
SELECT DISTINCT Name
FROM Production.Product AS p
WHERE EXISTS
(SELECT *
FROM Production.ProductModel AS pm
WHERE p.ProductModelID = pm.ProductModelID
AND pm.Name LIKE 'Long-Sleeve Logo Jersey%');
GO
-- OR
USE AdventureWorks2008R2;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN
(SELECT ProductModelID
FROM Production.ProductModel
WHERE Name LIKE 'Long-Sleeve Logo Jersey%');
GO
Nell'esempio seguente viene utilizzata la parola chiave IN in una sottoquery correlata o ripetuta. È una query che dipende dalla query esterna. La query viene eseguita ripetutamente, una volta per ogni riga che può essere selezionata dalla query esterna. Questa query recupera un'istanza del nome e del cognome di ogni dipendente il cui bonus nella tabella SalesPerson corrisponde a 5000.00 e con numero di identificazione uguale nelle tabelle Employee e SalesPerson.
USE AdventureWorks2008R2;
GO
SELECT DISTINCT p.LastName, p.FirstName
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN
(SELECT Bonus
FROM Sales.SalesPerson AS sp
WHERE e.BusinessEntityID = sp.BusinessEntityID);
GO
La sottoquery precedente non può essere valutata indipendentemente dalla query esterna. Richiede un valore per Employee.BusinessEntityID, ma questo valore cambia quando Motore di database di SQL Server esamina righe diverse della tabella Employee.
È inoltre possibile inserire una sottoquery correlata nella clausola HAVING della query esterna. Nell'esempio vengono trovati i modelli il cui prezzo massimo è più del doppio del prezzo medio per il modello.
USE AdventureWorks2008R2;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= ALL
(SELECT AVG(p2.ListPrice)
FROM Production.Product AS p2
WHERE p1.ProductModelID = p2.ProductModelID);
GO
In questo esempio vengono utilizzate due sottoquery correlate per trovare i nomi dei dipendenti che hanno venduto un determinato prodotto.
USE AdventureWorks2008R2;
GO
SELECT DISTINCT pp.LastName, pp.FirstName
FROM Person.Person pp JOIN HumanResources.Employee e
ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber = 'BK-M68B-42')));
GO
F. Utilizzo della clausola GROUP BY
Nell'esempio seguente viene trovato il totale di ogni ordine di vendita nel database.
USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
La presenza della clausola GROUP BY comporta la restituzione di una sola riga contenente il totale di tutte le vendite per ogni ordine di vendita.
G. Utilizzo della clausola GROUP BY con più gruppi
Nell'esempio seguente vengono individuati il prezzo medio e il totale delle vendite per l'anno in corso raggruppati per ID del prodotto e ID dell'offerta speciale.
USE AdventureWorks2008R2;
GO
SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS 'Average Price',
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY ProductID, SpecialOfferID
ORDER BY ProductID;
GO
H. Utilizzo delle clausole GROUP BY e WHERE
Nell'esempio seguente i risultati vengono suddivisi in gruppi dopo che sono state recuperate le righe con prezzi maggiori di $1000.
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, AVG(ListPrice) AS 'Average List Price'
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
I. Utilizzo della clausola GROUP BY con un'espressione
Nell'esempio seguente vengono creati gruppi in base a un'espressione. È possibile creare gruppi in base a un'espressione se tale espressione non include funzioni di aggregazione.
USE AdventureWorks2008R2;
GO
SELECT AVG(OrderQty) AS 'Average Quantity',
NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO
J. Utilizzo della clausola GROUP BY con la clausola ORDER BY
Nell'esempio seguente viene individuato il prezzo medio di ogni tipo di prodotto e i risultati vengono ordinati in base al prezzo medio.
USE AdventureWorks2008R2;
GO
SELECT ProductID, AVG(UnitPrice) AS 'Average Price'
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO
K. Utilizzo della clausola HAVING
Nel primo esempio viene illustrata la clausola HAVING con una funzione di aggregazione. Le righe della tabella SalesOrderDetail vengono raggruppate per ID di prodotto e vengono eliminati i prodotti con ordini con quantitativo medio minore o uguale a cinque. Nel secondo esempio viene illustrata una clausola HAVING senza funzioni di aggregazione.
USE AdventureWorks2008R2;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Questa query utilizza la clausola LIKE all'interno della clausola HAVING.
USE AdventureWorks2008R2 ;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. Utilizzo delle clausole HAVING e GROUP BY
Nell'esempio seguente viene illustrato l'utilizzo delle clausole GROUP BY, HAVING, WHERE e ORDER BY in un'istruzione SELECT. Vengono creati gruppi e valori di riepilogo, ma solo dopo l'eliminazione dei prodotti con prezzo maggiore di $25 e quantitativo medio minore di 5. I risultati vengono organizzati in base a ProductID.
USE AdventureWorks2008R2;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
M. Utilizzo della clausola HAVING con le funzioni SUM e AVG
Nell'esempio seguente il contenuto della tabella SalesOrderDetail viene raggruppato in base all'ID prodotto e vengono inclusi solo i gruppi di prodotti con ordini che ammontano a più di $1000000.00 e con quantitativo medio minore di 3.
USE AdventureWorks2008R2;
GO
SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
AND AVG(OrderQty) < 3;
GO
Per visualizzare i prodotti con vendite totali maggiori di $2000000.00, utilizzare la query seguente:
USE AdventureWorks2008R2;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Se si desidera che nei calcoli siano inclusi solo i prodotti per cui sono stati venduti almeno 1500 articoli, utilizzare la clausola HAVING COUNT(*) > 1500 per eliminare i prodotti per cui sono stati venduti meno di 1500 articoli. La query è la seguente:
USE AdventureWorks2008R2;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. Calcolo dei totali di gruppo con la clausola COMPUTE BY
Nell'esempio seguente vengono utilizzati due esempi di codice per illustrare l'utilizzo della clausola COMPUTE BY. Nel primo esempio viene utilizzata una clausola COMPUTE BY con una funzione di aggregazione, mentre nel secondo vengono utilizzate una clausola COMPUTE BY e due funzioni di aggregazione.
Per ogni tipo di prodotto la query calcola la somma degli ordini per i prodotti con prezzo minore di $5.00.
USE AdventureWorks2008R2;
GO
SELECT ProductID, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID, LineTotal
COMPUTE SUM(LineTotal) BY ProductID;
GO
La query recupera il tipo di prodotto e il totale degli ordini per i prodotti con prezzo unitario minore di $5.00. Nella clausola COMPUTE BY vengono utilizzate due diverse funzioni di aggregazione.
USE AdventureWorks2008R2;
GO
SELECT ProductID, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID, LineTotal
COMPUTE SUM(LineTotal), MAX(LineTotal) BY ProductID;
GO
O. Calcolo di valori complessivi con COMPUTE senza BY
Se si utilizza la parola chiave COMPUTE senza specificare BY, è possibile ottenere totali complessivi, conteggi complessivi e così via.
Nell'esempio seguente viene calcolato il totale complessivo dei prezzi e degli anticipi per tutti i tipi di prodotto con prezzo minore di $2.00.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $2.00
COMPUTE SUM(OrderQty), SUM(LineTotal);
GO
Nella stessa query è possibile utilizzare COMPUTE BY e COMPUTE senza la parola chiave BY. La query seguente calcola la somma dei quantitativi ordinati e dei totali di riga in base al tipo di prodotto, quindi calcola il totale complessivo dei quantitativi ordinati e i totali di riga.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID
COMPUTE SUM(OrderQty), SUM(LineTotal) BY ProductID
COMPUTE SUM(OrderQty), SUM(LineTotal);
GO
P. Calcolo di somme calcolate in tutte le righe
Nell'esempio seguente vengono illustrate tre colonne dell'elenco di selezione. Vengono inoltre visualizzati i totali basati su tutti i quantitativi ordinati e tutti i totali di riga alla fine dei risultati.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, LineTotal
FROM Sales.SalesOrderDetail
COMPUTE SUM(OrderQty), SUM(LineTotal);
GO
Q. Utilizzo di più clausole COMPUTE
Nell'esempio seguente viene calcolata la somma dei prezzi di tutti gli ordini con prezzo unitario minore di $5 organizzati per ID prodotto e quantitativo ordinato, nonché la somma dei prezzi di tutti gli ordini minori di $5 organizzati solo per ID prodotto. È possibile utilizzare diverse funzioni di aggregazione nella stessa istruzione includendo più clausole COMPUTE BY.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID, OrderQty, LineTotal
COMPUTE SUM(LineTotal) BY ProductID, OrderQty
COMPUTE SUM(LineTotal) BY ProductID;
GO
R. Confronto della clausola GROUP BY con la clausola COMPUTE
Nel primo esempio viene utilizzata la clausola COMPUTE per calcolare la somma di tutti gli ordini con prezzo unitario minore di $5.00 per tipo di prodotto. Nel secondo esempio vengono restituite le stesse informazioni di riepilogo utilizzando solo la clausola GROUP BY.
USE AdventureWorks2008R2;
GO
SELECT ProductID, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID
COMPUTE SUM(LineTotal) BY ProductID;
GO
Questa è la seconda query che utilizza la clausola GROUP BY.
USE AdventureWorks2008R2;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID
ORDER BY ProductID;
GO
S. Utilizzo dell'istruzione SELECT con le clausole GROUP BY, COMPUTE e ORDER BY
Nell'esempio seguente vengono restituiti solo gli ordini con prezzo unitario minore di $5, quindi viene calcolata la somma dei totali di riga per prodotto e il totale complessivo. Tutte le colonne calcolate sono incluse nell'elenco di selezione.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
COMPUTE SUM(SUM(LineTotal)) BY ProductID, OrderQty
COMPUTE SUM(SUM(LineTotal));
GO
T. Utilizzo dell'hint di ottimizzazione INDEX
Nell'esempio seguente vengono illustrati due diversi utilizzi dell'hint di ottimizzazione INDEX. Nel primo esempio viene illustrato come imporre l'utilizzo di un indice non cluster per il recupero di righe da una tabella, mentre nel secondo viene imposta un'analisi di tabella in base all'indice 0.
USE AdventureWorks2008R2;
GO
SELECT pp.FirstName, pp.LastName, e.NationalIDNumber
FROM HumanResources.Employee AS e WITH (INDEX(AK_Employee_NationalIDNumber))
JOIN Person.Person AS pp on e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Force a table scan by using INDEX = 0.
USE AdventureWorks2008R2;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX = 0) JOIN Person.Person AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
U. Utilizzo della clausola OPTION e degli hint GROUP
Nell'esempio seguente viene illustrato l'utilizzo della clausola OPTION (GROUP) con una clausola GROUP BY.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
V. Utilizzo dell'hint per la query UNION
Nell'esempio seguente viene utilizzato l'hint per la query MERGE UNION.
USE AdventureWorks2008R2;
GO
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
W. Utilizzo di un semplice operatore UNION
Nell'esempio seguente il set di risultati include il contenuto delle colonne ProductModelID e Name di entrambe le tabelle ProductModel e Gloves.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
X. Utilizzo di SELECT INTO con UNION
Nell'esempio seguente la clausola INTO nella seconda istruzione SELECT specifica che la tabella ProductResults contiene il set di risultati finale ottenuto con l'unione delle colonne designate delle tabelle ProductModel e Gloves. Si noti che la tabella Gloves viene creata nella prima istruzione SELECT.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
SELECT *
FROM dbo.ProductResults;
Y. Utilizzo dell'operatore UNION in due istruzioni SELECT con la clausola ORDER BY
L'ordine di alcuni parametri utilizzati con la clausola UNION è importante. Nell'esempio seguente vengono illustrati l'utilizzo errato e quello corretto di UNION in due istruzioni SELECT in cui una colonna deve essere rinominata nell'output.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
Z. Utilizzo dell'operatore UNION in tre istruzioni SELECT per illustrare gli effetti dell'opzione ALL e delle parentesi
Negli esempi seguenti viene utilizzato l'operatore UNION per combinare i risultati di tre tabelle contenenti 5 righe di dati identiche. Nel primo esempio viene utilizzato UNION ALL per mostrare i record duplicati e vengono restituite tutte le 15 righe. Nel secondo esempio l'operatore UNION viene utilizzato senza l'opzione ALL per eliminare le righe duplicate dai risultati combinati delle tre istruzioni SELECT e vengono restituite 5 righe.
Nel terzo esempio viene utilizzata l'opzione ALL con il primo operatore UNION e il secondo operatore UNION, che non utilizza l'opzione ALL, viene racchiuso tra parentesi. Il secondo operatore UNION viene elaborato per primo in quanto è racchiuso tra parentesi e restituisce 5 righe in quanto l'opzione ALL è stata omessa e i duplicati vengono rimossi. Queste 5 righe vengono combinate con i risultati della prima istruzione SELECT mediante le parole chiave UNION ALL. I duplicati tra i due set di 5 righe non vengono rimossi. Il risultato finale include 10 righe.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION ALL
(
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree
);
GO
Vedere anche