Condividi tramite


Nozioni fondamentali sui join

I join consentono di recuperare dati da due o più tabelle in base alle relazioni logiche esistenti tra le tabelle stesse. I join indicano la modalità di utilizzo dei dati di una tabella in Microsoft SQL Server 2005 per la selezione di righe in un'altra tabella.

Una condizione di join definisce il modo in cui due tabelle sono correlate in una query in base agli elementi seguenti:

  • L'impostazione della colonna di ogni tabella da utilizzare per il join. In una condizione di join tipica viene specificata una chiave esterna di una tabella e la chiave associata nell'altra tabella.
  • L'impostazione dell'operatore logico (ad esempio = o <>) da utilizzare per il confronto dei valori delle colonne.

Gli inner join possono essere specificati nelle clausole FROM e WHERE, mentre gli outer join possono essere specificati solo nella clausola FROM. Le condizioni di join vengono utilizzate insieme alle condizioni di ricerca delle clausole WHERE e HAVING per definire le righe da selezionare nelle tabelle di base a cui viene fatto riferimento nella clausola FROM.

L'impostazione delle condizioni di join nella clausola FROM consente di separare queste condizioni da altre condizioni di ricerca specificate nella clausola WHERE. Corrisponde inoltre al metodo consigliato per l'impostazione dei join. La sintassi SQL-92 semplificata per la definizione di un join nella clausola FROM è la seguente:

FROM first_table join_type second_table [ON (join_condition)]

join_type specifica il tipo di join da eseguire, ovvero inner join, outer join o cross join. join_condition definisce il predicato da valutare per ogni coppia di righe unite in join. Di seguito è riportato un esempio di definizione di join nella clausola FROM:

FROM Purchasing.ProductVendor JOIN Purchasing.Vendor
     ON (ProductVendor.VendorID = Vendor.VendorID)

L'istruzione seguente è un'istruzione SELECT semplice in cui viene utilizzato tale join:

SELECT ProductID, Purchasing.Vendor.VendorID, Name
FROM Purchasing.ProductVendor JOIN Purchasing.Vendor
    ON (Purchasing.ProductVendor.VendorID = Purchasing.Vendor.VendorID)
WHERE StandardPrice > $10
  AND Name LIKE N'F%'
GO

L'istruzione SELECT restituisce informazioni sul prodotto e sul fornitore per ogni combinazione di prodotti con prezzo maggiore di $ 10 fornito da una società il cui nome inizia con la lettera F.

Se in una singola query viene fatto riferimento a più tabelle, nessuno dei riferimenti alle colonne deve presentare ambiguità. Nell'esempio precedente entrambe le tabelle ProductVendor e Vendor includono una colonna denominata VendorID. I nomi di colonna duplicati in due o più tabelle a cui viene fatto riferimento nella query devono essere qualificati con il nome della tabella. Nell'esempio tutti i riferimenti alle colonne Vendor sono qualificati.

Se il nome di una colonna non è duplicato in due o più tabelle utilizzate nella query, non è necessario qualificare i riferimenti con il nome della tabella, come illustrato nell'esempio precedente. Un'istruzione SELECT di questo tipo a volte è di difficile comprensione in quanto non indica la tabella a cui appartiene ogni colonna. La query risulta più leggibile se tutte le colonne sono qualificate con i nomi delle rispettive tabelle. Il grado di leggibilità aumenta ulteriormente se si utilizzano gli alias di tabella, soprattutto quando è necessario qualificare anche i nomi delle tabelle con il nome del database e del proprietario. L'esempio seguente equivale all'esempio precedente. Per rendere la query più leggibile, sono stati però assegnati alias alle tabelle e i nomi di colonna sono stati qualificati con gli alias di tabella:

SELECT pv.ProductID, v.VendorID, v.Name
FROM Purchasing.ProductVendor pv JOIN Purchasing.Vendor v
    ON (pv.VendorID = v.VendorID)
WHERE StandardPrice > $10
    AND Name LIKE N'F%'

Nell'esempio precedente le condizioni di join sono specificate nella clausola FROM (metodo consigliato). Nella query seguente la stessa condizione di join è specificata nella clausola WHERE:

SELECT pv.ProductID, v.VendorID, v.Name
FROM Purchasing.ProductVendor pv, Purchasing.Vendor v
WHERE pv.VendorID = v.VendorID
    AND StandardPrice > $10
    AND Name LIKE N'F%'

Nell'elenco di selezione di un join è possibile fare riferimento a tutte le colonne delle tabelle unite in join o a qualsiasi subset delle colonne. Nell'elenco di selezione non è necessario specificare le colonne di ogni tabella del join. Ad esempio, in un join tra tre tabelle è possibile utilizzare una sola tabella come collegamento tra le altre due e le colonne di tale tabella non devono essere necessariamente incluse nell'elenco di selezione.

Sebbene le condizioni di join includano in genere confronti di uguaglianza (=), è possibile specificare altri operatori di confronto o relazionali e altri predicati. Per ulteriori informazioni, vedere Utilizzo di operatori nelle espressioni e WHERE (Transact-SQL).

Durante l'elaborazione di join in SQL Server, il motore query sceglie il metodo di elaborazione di join più efficiente tra quelli possibili. Sebbene nell'esecuzione fisica dei diversi join vengano adottati metodi di ottimizzazione diversi, la sequenza logica comune è la seguente:

  • Applicazione delle condizioni di join specificate nella clausola FROM.
  • Applicazione delle condizioni di join e di ricerca specificate nella clausola WHERE.
  • Applicazione delle condizioni di ricerca specificate nella clausola HAVING.

Se le condizioni vengono spostate tra le clausole FROM e WHERE, in alcuni casi questa sequenza può influire sui risultati della query.

Non è necessario che alle colonne di una condizione di join sia associato lo stesso nome o lo stesso tipo di dati. Se tuttavia i tipi di dati sono diversi, devono essere compatibili o supportare la conversione implicita in SQL Server. Se non è possibile eseguire la conversione implicita dei tipi di dati, è necessario impostare nella condizione di join la conversione esplicita tramite la funzione CAST. Per ulteriori informazioni sulle conversioni implicite ed esplicite, vedere Conversione del tipo di dati (Motore di database).

La maggior parte delle query che includono un join possono essere riformulate specificando una subquery, ovvero una query nidificata in un'altra query. La maggior parte delle subquery possono a loro volta essere riformulate come join. Per ulteriori informazioni sulle subquery, vedere Nozioni fondamentali sulle subquery.

[!NOTA] Non è possibile unire le tabelle in join direttamente in base alle colonne di tipo ntext, text o image. È tuttavia possibile eseguire il join in base alle colonne di tipo ntext, text e image in modo indiretto tramite la funzione SUBSTRING. Ad esempio, SELECT * FROM t1 JOIN t2 ON SUBSTRING(t1.textcolumn, 1, 20) = SUBSTRING(t2.textcolumn, 1, 20) esegue un inner join tra due tabelle sui primi 20 caratteri di ogni colonna di tipo text delle tabelle t1 e t2. In alternativa, è possibile confrontare colonne di tipo ntext e text di due tabelle confrontando la lunghezza delle colonne con una clausola WHERE, come illustrato nell'esempio seguente: WHERE DATALENGTH(p1.pr_info) = DATALENGTH(p2.pr_info)

Vedere anche

Concetti

Utilizzo dei join
Valori Null e join
Ordine di precedenza degli operatori logici

Altre risorse

Esempi di istruzioni SELECT (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005