Clausola JOIN di SQL Server
- 12-09-2022
- Toanngo92
- 0 Comments
Mục lục
Presentazione di JOIN in SQL Server
JOIN viene utilizzato per recuperare i dati da due o più tabelle in base alla relazione logica tra le tabelle. Un join ( JOIN ) in genere specifica una relazione di chiave esterna tra le tabelle. Determina in che modo due tabelle sono correlate in una query in base a:
- Specificare la colonna di ciascuna tabella da utilizzare per il join ( JOIN ). Un tipico join ( JOIN ) specifica una chiave esterna da una tabella e la relativa chiave in un’altra.
- Specificare un operatore logico come =, <> da utilizzare per confrontare i valori dalle colonne.
Il JOIN può essere specificato nella clausola FROM o WHERE.
Sintassi:
SELECT <ColumnName1>, <ColumnName2>, ... <ColumnNameN> FROM Table_Name1 AS alias_1 JOIN Table_Name2 AS alias_2 ON alias_1.<RelatedColumn> = alias_2.<RelatedColumn>
Si supponga di voler ottenere un elenco di nomi, cognome e qualifica dei dipendenti dalle tabelle HumanResources.Employee e Person.Person. Per ottenere le informazioni di 2 tabelle, è necessario unire le 2 tabelle secondo l’associazione chiave esterna della colonna BusinessEntityID. Per esempio:
SELECT A.FirstName,A.LastName,B.JobTitle FROM Person.Person A JOIN HumanResources.Employee B ON A.BusinessEntityID = B.BusinessEntityID
Sviluppando ulteriormente questo problema, abbiamo 3 tipi di JOINS concettuali:
- Unioni interne
- Join esterni
- Il sé si unisce
Unisciti interni
Un inner join viene formato quando i record di due tabelle vengono combinati solo se le righe di entrambe le tabelle vengono abbinate in base a una colonna comune.
Differenza tra JOIN e INNER JOIN : JOIN restituisce tutte le righe dalle tabelle in cui il record chiave di una tabella è uguale ai record chiave di un’altra tabella . INNER JOIN seleziona tutte le righe da entrambe le tabelle di join, purché vi sia una corrispondenza tra le colonne
Sintassi:
SELECT <ColumnName1>,<ColumnName2> ... <ColumnNameN> FROM Table_A AS Table_Alias_A INNER JOIN Table_B AS Table_Alias_B ON Table_Alias_A.<RelatedColumn> = Table_Alias_B.<RelatedColumn>
Per esempio:
SELECT A.FirstName, A.LastName, B.JobTitle FROM Person.Person A INNER JOIN HumanResources.Employee B ON A.BusinessEntityID = b.BusinessEntityID
Join esterno
I join esterni sono istruzioni di join che restituiscono tutte le righe da almeno una delle tabelle specificate nella clausola FROM , purché tali righe soddisfino una qualsiasi delle condizioni WHERE o HAVING dell’istruzione SELECT . Due tipi di outer join comunemente usati sono i seguenti:
- Join esterno sinistro
- Join esterno destro
Join esterno sinistro
Il join esterno sinistro restituisce tutti i record della tabella di sinistra e solo il record corrispondente a destra.
Sintassi:
SELECT <ColumnList> FROM Table_A AS ALIAS_A LEFT OUTER JOIN Table_B AS ALIAS_B ON ALIAS_A.<RelatedColumn> = ALIAS_B.<RelatedColumn>
Supponiamo che tu voglia ottenere tutti gli ID cliente dalla tabella Sales.Customers e informazioni sull’ordine come date di spedizione., date di scadenza, ottenere anche clienti che non hanno effettuato alcun ordine, ma il numero di record è molto elevato, quindi ordiniamo il limite prima 2019, per fare ciò, esegui il LEFT OUTER JOIN come segue:
SELECT A.CustomerID, B.DueDate, B.ShipDAte FROM Sales.Customer A LEFT OUTER JOIN Sales.SalesOrderHeader B ON A.CustomerID = B.CustomerID AND YEAR(B.DueDate) < 2019
Nel codice sopra, il join esterno sinistro è una struttura tra le tabelle Sales.Customer e Sales.SalesOrderHeader . La tabella viene unita in base alla colonna ID cliente. In questa situazione, tutti i record della tabella di sinistra sono Sales.Customer e solo i record corrispondenti della tabella di destra sono Sales.SalesOrderHeader , se i dati della tabella di destra non corrispondono, la tabella di sinistra viene comunque recuperata e la tabella a il diritto dei dati restituirà nullo.
Join esterno destro
Il join esterno destro recupera tutti i record dalla tabella di destra del join, indipendentemente dal fatto che sia presente una corrispondenza nella prima tabella.
SELECT <ColumnList> FROM Left_Table_Name AS Alias_A RIGHT OUTER JOIN Table_B as ALIAS_B ON Alias_A.<RelatedColumn> = Allias_B.<RelatedColumn>
Ad esempio, si desidera recuperare tutti i nomi dei prodotti dalla tabella dei prodotti e tutti gli ordini corrispondenti dalla tabella SalesOrderDetail anche se potrebbero esistere record di prodotti che non corrispondono ai dati nella tabella SalesOrderDetail (prodotti che non sono stati ancora venduti). mai) come segue:
SELECT P.Name,S.SalesOrderID FROM Sales.SalesOrderDetail S RIGHT OUTER JOIN Production.Product P ON P.ProductID = S.ProductID
Partecipazione automatica
Un join automatico viene utilizzato per mostrare la relazione tra i record nella stessa tabella. Una tabella unita a se stessa si chiama Self-Join .
Ad esempio, si desidera utilizzare l’unione automatica per recuperare i dettagli del prodotto che hanno lo stesso colore nella tabella Produzione.Prodotto
SELECT p1.ProductID, p1.Color, p1.Name, p2.Name FROM Production.Product p1 INNER JOIN Production.Product p2 ON p1.Color = p2.Color ORDER BY p1.ProductID
dichiarazione MERGE
L’ istruzione MERGE consente di mantenere una tabella di destinazione in determinate condizioni di join su una tabella di origine utilizzando una singola istruzione.
Ad esempio, se vuoi:
- Confronta il cognome e il nome del cliente da 2 tabelle di origine e destinazione
- Aggiorna le informazioni sul cliente nella tabella di destinazione se nome e cognome corrispondono
- Aggiungere un nuovo record nella tabella di destinazione se il cognome e il nome nella tabella di origine non esistono nella tabella di destinazione
- Elimina i record nella tabella di destinazione se il cognome e il nome non corrispondono alla tabella di origine
L’ istruzione MERGE completa le attività in un’unica istruzione. MERGE consente inoltre di visualizzare i record che sono stati inseriti, aggiornati o eliminati utilizzando la clausola OUTPUT.
Sintassi:
MERGE target_table USING source_table ON match_condition WHEN MATCHED THEN UPDATE SET col1 = vale [,Col2 = val2] WHEN [TARGET] NOT MATCHED THEN INSERT (Col1[,Col2...]) VALUES(Val1[,Val2...]) WHEN NOT MATCH BY SOURCE THEN DELETE [OUTPUT $action, inserted.Col1,Deleted.Col1,....];
Spiegare:
- target_table: la tabella di destinazione in cui i dati cambieranno qui
- source_table: tabella di origine, contiene i record che possono essere aggiunti, aggiornati ed eliminati nella tabella di destinazione
- match_conditions: la condizione di unione (JOIN) e gli eventuali operatori di confronto.
- MATCHED: restituisce true se i record tabella_destinazione e tabella_origine corrispondono a condizione_corrispondenza.
- NOT MATCHED: restituisce true se il record di source_table non esiste in target_table.
- SOURCE NOT MATCH: restituisce se il record esiste in target_table ma non in source_table.
- OUTPUT: la clausola opzionale consente di visualizzare i record che sono stati tema/cancellati/aggiornati in target_Table.
L’istruzione MERGE termina con un punto e virgola (;).
Per esempio:
use AdventureWorks2019 go SET IDENTITY_INSERT [Person].[AddressType] ON MERGE INTO [Person].[AddressType] AS Target USING (VALUES (1,'Billing') , (2,'Home'),(3,'Headquarters'),(4,'Primary'),(5,'Shipping'),(6,'Archival'),(7,'Contact'),(8,'Alternative')) AS Source ([AddressTypeID],[Name]) ON (Target.[AddressTypeID] = Source.[AddressTypeID]) WHEN MATCHED AND (Target.[Name] <> Source.[Name]) THEN UPDATE SET [Name] = Source.[NAME] WHEN NOT MATCHED BY TARGET THEN INSERT ([AddressTypeID],[Name]) VALUES(Source.[AddressTypeID],Source.[Name]) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, Inserted.[AddressTypeID], Inserted.Name, Deleted.[AddressTypeID], Deleted.Name;
La tabella Person.AddressType è la tabella di destinazione, i dati di esempio vengono inseriti tramite il comando USING (VALUES (1,’Billing’) , (2,’Home’),(3,’Headquarters’),(4,’Primary’) ,(5,’Shipping’),(6,’Archival’),(7,’Contact’),(8,’Alternative’)) AS Source è la tabella di origine, la condizione corrispondente è la colonna AddressTypeID di entrambe le tabelle sorgente e destinazione. Se la condizione di corrispondenza restituisce false (NON MATCHED). I nuovi record verranno aggiunti alla tabella di destinazione. Se le condizioni di corrispondenza restituiscono true (MATCHED), il record verrà aggiornato alla tabella di destinazione in base ai dati della tabella di origine.
Se i record nella tabella di destinazione non corrispondono alla tabella di origine (NON ABBINATI DA ORIGINE), vengono eliminati dalla tabella di destinazione. Il ruolo dell’ultima istruzione è segnalare le righe che sono state aggiunte/aggiornate/eliminate e visualizzare l’output.