Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

È possibile unire due tabelle senza una colonna comune?

Sì, è possibile! La risposta più lunga è sì, esistono alcuni modi per unire due tabelle senza una colonna in comune, tra cui CROSS JOIN (prodotto cartesiano) e UNION. Quest'ultima non è tecnicamente una clausola join, ma può essere utile per unire tabelle in SQL. In questo articolo vi guiderò attraverso le diverse soluzioni con degli esempi.

Quando è necessario unire tabelle senza una colonna comune?

I principianti che si avvicinano all'SQL iniziano solitamente con le clausole equi join standard, in cui due tabelle sono unite da una colonna comune. Tuttavia, i compiti reali di un analista di dati sono solitamente più vari e complessi.

Ad esempio, esistono molti casi di utilizzo di non equi join, in cui due tabelle vengono unite utilizzando operatori condizionali diversi dal segno di uguale. Se non conoscete questo tipo di JOIN, date un'occhiata al nostro corso interattivo SQL JOINs. Offre oltre 90 esercizi pratici su diversi tipi di JOIN.

In altri casi, è possibile che si desideri ottenere tutte le combinazioni tra le righe di due tabelle. Ad esempio, se gestite un ristorante, potreste voler vedere tutte le possibili combinazioni tra i vini della vostra carta dei vini e le portate principali del vostro menu.

Oppure, immaginate che le informazioni sui vostri fornitori siano memorizzate in tabelle diverse. Potrebbero anche avere nomi di colonne diversi per tipo di prodotto (ad esempio, vini, succhi, frutta, ecc.). Potremmo voler unire tutte le informazioni per generare un'unica tabella con tutti i fornitori.

In questi casi, si desidera unire due o più tabelle senza una colonna comune. Sembra che si tratti di un'operazione SQL piuttosto semplice. Eccome se lo è! In questa guida vi suggerirò un paio di soluzioni.

Ma prima, diamo un'occhiata ai dati che utilizzeremo per i nostri esempi.

Conoscere i dati

Gestiamo un ristorante e abbiamo dati rilevanti memorizzati in diverse tabelle, tra cui wine e main_course.

La tabella wine contiene l'ID del vino, il nome del vino, l'ID del fornitore e il prezzo:

idnamesupplier_idprice
1Merlot5007.95
2House4002.45
3Sangiovese6005.20

La tabella main_course contiene per ogni piatto: il suo l'ID, il nome, l'ID del fornitore principale di questo piatto e il prezzo:

main_course

idnamemajor_supplier_idprice
1Cardamom Maple Salmon20019.99
2Classic Macaroni & Cheese1008.99
3Baked Teriyaki Chicken30011.99
4Blue Cheese Beef Tenderloin40015.99

Vediamo come unire le tabelle per ottenere i risultati desiderati.

Come unire due tabelle senza una colonna comune

Nel nostro primo esempio, vogliamo vedere tutte le possibili combinazioni di vini e portate principali del nostro menu. Esistono almeno due approcci per unire la tabella dei vini (wine) con quella delle portate (main_course) per ottenere il risultato desiderato.

L'uso della sintassi "FROM Tabella1, Tabella2

Un modo per unire due tabelle senza una colonna comune è utilizzare una sintassi obsoleta per unire le tabelle. Con questa sintassi, si elencano semplicemente le tabelle che si desidera unire nella clausola FROM e si utilizza una clausola WHERE per aggiungere condizioni di unione, se necessario.

Se desideriamo ottenere ogni possibile combinazione tra le righe di due tabelle, non è necessario includere alcuna condizione di unione. Possiamo usare una query come questa:

SELECT w.name AS wine, m.name AS main_course
FROM wine w, main_course m;

Il risultato della query sarà un prodotto cartesiano (un cross join ), il cui insieme di risultati ha un numero totale di righe pari al numero di righe della prima tabella moltiplicato per il numero di righe della seconda tabella.

winemain_course
MerlotCardamom Maple Salmon
HouseCardamom Maple Salmon
SangioveseCardamom Maple Salmon
MerlotClassic Macaroni & Cheese
HouseClassic Macaroni & Cheese
SangioveseClassic Macaroni & Cheese
MerlotBaked Teriyaki Chicken
HouseBaked Teriyaki Chicken
SangioveseBaked Teriyaki Chicken
MerlotBlue Cheese Beef Tenderloin
HouseBlue Cheese Beef Tenderloin
SangioveseBlue Cheese Beef Tenderloin

Abbiamo ottenuto il risultato desiderato. Questa è una possibile soluzione per unire due tabelle quando l'obiettivo è ottenere un insieme di risultati con tutte le possibili combinazioni di righe. Tuttavia, non è l'approccio migliore.

Gli esperti di SQL preferiscono utilizzare la parola chiave esplicita CROSS JOIN per questo tipo di operazioni. È evidente che stiamo eseguendo intenzionalmente un cross join e che non abbiamo omesso accidentalmente la condizione di join WHERE, cosa che potrebbe accadere quando si utilizza la sintassi obsoleta per unire le tabelle.

Per ulteriori informazioni sui vantaggi della nuova sintassi di unione delle tabelle, consultate l'articolo Qual è la differenza tra JOIN e tabelle multiple in FROM?

L'uso dell'operatore CROSS JOIN

Come avrete già intuito, il secondo approccio per ottenere tutte le possibili combinazioni di righe da due tabelle è usando l'operatore CROSS JOIN:

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;

Questa query produce lo stesso identico set di risultati mostrato in precedenza. Tuttavia, questa sintassi è preferibile in quanto indica chiaramente l'intenzione di eseguire una CROSS JOIN ed è più leggibile per gli altri utenti del codice SQL.

Per saperne di più sulle cross join, consultate la nostra Guida illustrata a SQL CROSS JOIN.

L'uso di UNION o UNION ALL

Esistono altri casi in cui è possibile unire due tabelle senza una colonna in comune. Come nell'esempio citato in precedenza, si potrebbero voler condensare tutte le informazioni sui fornitori memorizzate in più tabelle. In questo caso non vogliamo ottenere un prodotto cartesiano. Quindi, come si uniscono le tabelle?

In questo caso, si utilizza UNION per unire le informazioni di più tabelle. Tecnicamente non si tratta di un join, ma può essere molto utile per unire le righe di più tabelle, come nel nostro esempio.

In poche parole, JOINs unisce i dati aggiungendo le colonne di una tabella a quelle di un'altra tabella. Al contrario, UNIONs combina i dati aggiungendo le righe alle righe di un'altra tabella.

Quindi, se vogliamo generare un elenco combinato degli ID dei fornitori dalle tabelle wine e main_course, possiamo utilizzare la seguente query SQL:

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;

In questo caso, selezioniamo prima l'ID dei fornitori dalla tabella wine (colonna supplier_id) e dalla tabella main_course (colonna major_supplier_id) separatamente. Quindi, uniamo queste righe utilizzando la parola chiave UNION. Infine, ordiniamo il risultato per comodità:

supplier_id
100
200
300
400
500
600

Quando si utilizza UNION in SQL, è necessario tenere presente quanto segue:

  • Tutte le istruzioni di SELECT devono elencare lo stesso numero di colonne.
  • Le colonne corrispondenti devono avere lo stesso tipo di dati.
  • Le colonne corrispondenti possono avere nomi diversi, come nel nostro esempio. Per impostazione predefinita, il nome della colonna corrispondente del risultato sarà preso dalla prima istruzione SELECT. Se necessario, è possibile impostare i nomi delle colonne ottenute utilizzando la parola chiave AS. Si noti che le colonne provenienti da tabelle diverse devono essere nominate nello stesso ordine affinché corrispondano correttamente.
  • L'operatore UNION rimuove i duplicati dall'insieme dei risultati. Come si può notare, la colonna supplier_id 400 era presente in entrambe le tabelle, ma appare solo una volta nell'insieme dei risultati. Se non si desidera rimuovere i duplicati, si deve usare l'operatore UNION ALL:

    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    

Il risultato di questa query includerà supplier_id 400 due volte:

supplier_id
100
200
300
400
400
500
600

Se si dà un caso nel quale, unire due tabelle senza una colonna comune in cui CROSS JOIN e UNION non sono applicabili, consultate questo articolo con esempi di non equi join . Potreste trovare alcuni esempi pertinenti.

È ora di esercitarsi con CROSS JOIN e UNION!

Ora che ne sapete di più su come unire le tabelle senza una colonna comune, sarete pronti per la domanda: come si uniscono due tabelle senza una colonna in comune? Si tratta di una domanda molto comune nei colloqui di lavoro in SQL!

Se volete saperne di più su JOINs, date un'occhiata al video SQL JOIN Basics della nostra serie "We Learn SQL" su YouTube. Potete provare anche la guida di LearnSQL.it sui modi migliori per imparare SQL JOINs.

Tuttavia, probabilmente sapete già che la strada più breve per diventare esperti di SQL è quella di fare molta pratica nella scrittura di query SQL. LearnSQL.it offre un corso completo su SQL JOINs con 93 esercizi interattivi. In questo corso avrete l'opportunità di esercitarvi su tutti i tipi di JOINs basici, tra cui CROSS JOINs, self-join, non-equi join e join di più tabelle.

Buon apprendimento!