Mentre nei simple join sono visualizzate tutte le righe contenute nelle tabelle relazionate aventi valori uguali per una medesima colonna, nei complex join si limita il risultato della query usando un'ulteriore condizione.
SQL> SELECT padre.idpadre, nominativo, nome, figlio.datanascita 2 FROM padre, figlio 3 WHERE padre.idpadre = figlio.idpadre 4 AND padre.datanascita = TO_DATE ('01/11/1945', 'DD-MM-YYYY');
L'operatore logico AND ci consente di filtrare ulteriormente i dati delle tabelle e rappresenta, quindi, la seconda condizione. Nell'esempio abbiamo posto in relazione ogni padre con il relativo figlio, ma con la seconda condizione imposta visualizziamo esclusivamente il padre la cui data di nascita è '01/11/1945' e i relativi figli.
Join e alias di tabella
Abbiamo già introdotto gli alias di colonna, ovvero nomi scelti a piacere da usare in sostituzione dei nomi di colonna. Gli alias risultano molto comodi quando i nomi di colonna sono lunghi e siamo costretti a ripeterli più volte all'interno di una query, oppure quando sono di difficile comprensione. Anche i nomi di tabelle, quando usati nelle query, possono avere alias. Gli alias di tabella sono specificati con la clausola FROM (in qualsiasi statement SELECT) accanto ai veri nomi di tabella.
Assegnare alias alle tabelle
SELECT ... FROM <tabella 1> <alias 1>, <tabella 2> <alias 2>, ... <tabella n> <alias n> ...
Per esempio riprendiamo la query usata per la precedente simple join utilizzando anche gli alias di tabella.
SQL> SELECT p.idpadre, nominativo, nome, f.datanascita 2 FROM padre p, figlio f 3 WHERE p.idpadre = f.idpadre;
Quando utilizziamo gli alias di tabella con la clausola FROM non possiamo assolutamente specificare i nomi reali di tabella per selezionare le colonne (SELECT) o con la clausola WHERE.
Usare la sintassi ANSI SQL 99
Una importante novità della versione Oracle 9i è la clausola JOIN
, conforme allo standard ISO/ANSI SQL 1999, che permette di specificare in un modo più chiaro join fra tabelle ed è raccomandato rispetto alla tradizionale sintassi SQL che abbiamo seguito negli esempi precedenti.
NATURAL JOIN
Il join è creato su tutte le colonne che hanno il medesimo nome in entrambe le tabelle.
Sintassi di NATURAL JOIN
<tabella> NATURAL JOIN <tabella>
Non possiamo eseguire questo tipo di join sulle tabelle Padre e Figlio perché entrambe hanno la colonna "datanascita" ma non sono fra loro correlate. Infatti scrivendo la query:
SQL> SELECT idpadre, nominativo, nome 2 FROM padre NATURAL JOIN figlio;
otteniamo un insieme vuoto (Nessuna riga selezionata).
Proviamo ad eseguire un NATURAL JOIN
fra le tabelle "countries" e "regions" del database Seed. Colleghiamoci con l'utente hr.
SQL> SELECT country_id, country_name, region_name 2 FROM countries NATURAL JOIN regions;
Le tabelle "countries" e "regions" sono correlate fra loro mediante la colonna "region_id". È possibile quindi eseguire un NATURAL JOIN
.
Quando usiamo un NATURAL JOIN fra due tabelle è necessario che le colonne correlate siano dello stesso datatype. Così come abbiamo visto negli esempi precedenti non possiamo impiegare nè gli alias di tabella né specificare il nome di tabella per qualificare una colonna.
JOIN ... USING
Il NATURAL JOIN
ha la pecca di eseguire join di tutte le colonne, fra le tabelle specificate con la clausola FROM, che hanno lo stesso nome. Se non desideriamo che l'operazione di join sia eseguita fra tutte le colonne con la stessa denominazione ma solamente fra quelle da noi desiderate, allora dobbiamo ricorrere alla forma JOIN...USING
.
Sintassi del costrutto JOIN ... USING
<tabella> JOIN <tabella> USING (<colonna1>, ... <colonna n>)
Esempio
SQL> SELECT idpadre, nominativo, nome, figlio.datanascita 2 FROM padre JOIN figlio USING (idpadre);
JOIN...ON
Quando invece non abbiamo nomi di colonna comuni fra le tabelle da sottoporre a join, oppure quando vogliamo esplicitamente dichiarare le condizioni di join allora usiamo la forma JOIN...ON.
Esempio
SQL> SELECT padre.idpadre, nominativo, nome, figlio.datanascita 2 FROM padre JOIN figlio ON padre.idpadre = figlio.idpadre;