Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 31 di 41
  • livello principiante
Indice lezioni

Join complessi

Collegamenti con maggiori condizioni, aliasing dei nomi di tabella, varianti dello standard ANSI
Collegamenti con maggiori condizioni, aliasing dei nomi di tabella, varianti dello standard ANSI
Link copiato negli appunti

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');
Risultato della query

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.

Risultato della query

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;
Risultato della query

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);
Risultato della query

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;
Risultato della query

Ti consigliamo anche