back to top

Join e Subquery – Guida Oracle

Finora abbiamo analizzato query che operano su una singola tabella, ma una caratteristica fondamentale dei database relazionali è, invece, proprio quella di riuscire ad interrogare simultaneamente diverse tabelle.

In sostanza, è possibile ottenere tuple i cui campi appartengono a tabelle differenti in modo tale da avere, con una singola query, tutte le informazioni necessarie anche se appartenenti a tabelle differenti.

La sintassi che andremo ad utilizzare è la seguente:

SELECT [DISTINCT] [<alias_al>.]<colonna_1>,
                  [<alias_a2>.]<colonna_1>,
                  [<alias_a2>.]<colonna_2> 
FROM <tabella_1> [<alias_a1>], 
     <tabella_2> [<alias_a2>]
[WHERE <condizione>]

Essa indica che abbiamo due tabelle che andremo ad interrogare, per ognuna delle quali si può definire un alias (la definizione di un alias è consigliata nel caso in cui le due tabelle dovessero avere campi con lo stesso nome in modo tale da avere nomi univoci senza dover utilizzare i nomi tabella come prefissi per le colonne).

Utilizziamo un semplice esempio per chiarire come sfruttare appieno le potenzialità della JOIN. Supponiamo di avere la tabella "Indirizzi" che contiene appunto gli indirizzi dei dipendenti della nostra tabella "Anagrafica"; ora pensiamo di voler effettuare una query che estragga, per ogni dipendente, i seguenti campi: Nome, Cognome, Ruolo, Indirizzo, Cap, Città.

Conoscendo la struttura della nostra tabella "Anagrafica" sappiamo che da essa potremo estrarre i primi tre campi del nostro elenco, avremo invece bisogno della tabella "Indirizzi" per i campi restanti.

Pertanto, prima di procedere, dovremo definire la tabella "Indirizzi":

CREATE TABLE Indirizzi
(
  Nome VARCHAR2(80 BYTE),
  Cognome VARCHAR2(80 BYTE),
  Indirizzo VARCHAR2(80 BYTE),
  Cap NUMBER,
  Citta VARCHAR2(40 BYTE)
);

Creata la tabella, andiamo a popolarla con un po’ di dati di esempio:

INSERT INTO Indirizzi VALUES ('Mario', 'Rossi', 'Via Roma 1', 20100, 'Milano');
INSERT INTO Indirizzi VALUES ('Carlo', 'Neri', 'Via Lecco 1', 20100, 'Milano');
INSERT INTO Indirizzi VALUES ('Lucia', 'Bianchi', 'Via Dante 1', 20100, 'Milano');

A questo punto possiamo effettuare la nostra JOIN per estrarre i dati di nostro interesse per i dipendenti presenti in entrambe le tabelle. Vediamo la query:

SELECT Ana.Nome, Ana.Cognome, Ana.Ruolo, Ind.Indirizzo, Ind.Cap, Ind.Citta
FROM Anagrafica Ana, Indirizzi Ind
WHERE Ana.Nome = Ind.Nome
AND Ana.Cognome = Ind.Cognome;

La nostra query ci restituirà qualcosa del genere:

NomeCognomeRuoloIndirizzoCapCitta
MarioRossiImpiegatoVia Roma 120100Milano
CarloNeriQuadroVia Lecco 120100Milano
LuciaBianchiImpiegatoVia Dante 120100Milano

Le subquery

Finora, nelle nostre clausole di WHERE abbiamo considerato sempre semplici condizioni. Abbiamo comparato due colonne, oppure colonne con costanti… ma, si possono considerare condizioni ben più complesse, si può ad esempio utilizzare vere e proprie query come condizione della WHERE. In tal caso, la query utilizzata come condizione della WHERE viene definita subquery e la query completa che la contiene viene definita query nidificata.

Venendo alle nostre tabelle, supponiamo di voler ottenere l’elenco dei dipendenti presenti in "Anagrafica" per i quali non disponiamo ancora dei relativi indirizzi.

Possiamo sfruttare una subquery per ottenere quanto desideriamo:

SELECT *
FROM Anagrafica
WHERE Cognome NOT IN (SELECT Cognome FROM Indirizzi);

Ottenendo:

NomeCognomeStipendioRuolo
MariaViola35000Quadro
MarcoMarrone25000Impiegato

Quello che abbiamo fatto è verificare che i dati presenti nella colonna "Cognome" della taballa "Anagrafica" non siano presenti (NOT IN) nel resultset di una query di selezione (che è, appunto, la nostra subquery) dei valori della colonna "Cognome" della tabella "Indirizzi".

PubblicitÃ