Ottieni dati da più tabelle

Visualizzazione di dati da più tabelle

Le tabelle correlate di un database di grandi dimensioni sono collegate tramite l'uso di chiavi esterne e primarie o quelle che vengono spesso chiamate colonne comuni. La possibilità di unire le tabelle ti consentirà di aggiungere più significato alla tabella dei risultati prodotta. Per unire 'n' tabelle di numeri in una query, sono necessarie condizioni di join minime (n-1). In base alle condizioni di join, Oracle combina la coppia di righe corrispondenti e visualizza quella che soddisfa la condizione di join.

I join sono classificati come di seguito

  • Natural join (noto anche come equijoin o simple join): crea un join utilizzando una colonna denominata e definita comunemente.

  • Join non di uguaglianza: unisce le tabelle quando non ci sono righe equivalenti nelle tabelle da unire, ad esempio per abbinare i valori in una colonna di una tabella con un intervallo di valori in un'altra tabella.

  • Auto-join: unisce un tavolo a se stesso.

  • Outer join: include i record di una tabella nell'output quando non sono presenti record corrispondenti nell'altra tabella.

  • Join cartesiano (noto anche come prodotto cartesiano o cross join): replica ogni riga della prima tabella con ogni riga della seconda tabella. Crea un join tra le tabelle visualizzando ogni possibile combinazione di record.

Natural Join

La parola chiave NATURAL può semplificare la sintassi di un equijoin. Un NATURAL JOIN è possibile ogni volta che due (o più) tabelle hanno colonne con lo stesso nome e le colonne sono compatibili con il join, ovvero le colonne hanno un dominio di valori condiviso. L'operazione unisce le righe delle tabelle che hanno valori di colonna uguali per le colonne con lo stesso nome.

Considera la relazione uno-a-molti tra le tabelle DEPARTMENTS e EMPLOYEES. Ogni tabella ha una colonna denominata DEPARTMENT_ID. Questa colonna è la chiave primaria della tabella DEPARTMENTS e una chiave esterna della tabella EMPLOYEES.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;

FIRST_NAME DNAME
---------- ------
MILLER     DEPT 1
JOHN       DEPT 1
MARTIN     DEPT 2
EDWIN      DEPT 2

La seguente query SELECT unisce le due tabelle specificando esplicitamente la condizione di join con la parola chiave ON.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);

Esistono alcune limitazioni relative al NATURAL JOIN. Non è possibile specificare una colonna LOB con NATURAL JOIN. Inoltre, le colonne coinvolte nel join non possono essere qualificate da un nome di tabella o da un alias.

Clausola USING

Utilizzando i join naturali, Oracle identifica implicitamente le colonne per formare la base del join. Molte situazioni richiedono una dichiarazione esplicita delle condizioni di adesione. In questi casi, utilizziamo la clausola USING per specificare i criteri di adesione. Poiché la clausola USING unisce le tabelle in base all'uguaglianza delle colonne, è anche nota come Equijoin. Sono anche noti come join interni o join semplici.

Sintassi:

SELECT <column list>
FROM   TABLE1   JOIN   TABLE2	
USING (column name)

Considera la seguente query SELECT, la tabella EMPLOYEES e la tabella DEPARTMENTS sono unite utilizzando la colonna comune DEPARTMENT_ID.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);

Self Join

Un'operazione SELF-JOIN produce una tabella dei risultati quando esiste la relazione di interesse tra le righe archiviate in una singola tabella. In altre parole, quando una tabella è unita a se stessa, il join è noto come Self Join.

Si consideri la tabella EMPLOYEES, che contiene i dipendenti e i relativi responsabili dei rapporti. Per trovare il nome del responsabile per un dipendente sarebbe necessaria un'unione alla tabella EMP stessa. Questo è un tipico candidato per Self Join.

SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;

Non equijoins

Un join di non uguaglianza viene utilizzato quando le colonne correlate non possono essere unite con un segno di uguale, il che significa che non ci sono righe equivalenti nelle tabelle da unire. Un join di non uguaglianza consente di memorizzare il valore minimo di un intervallo in una colonna di un record e il valore massimo in un'altra colonna. Quindi, invece di trovare una corrispondenza colonna-colonna, puoi utilizzare un join di non uguaglianza per determinare se l'articolo spedito rientra tra gli intervalli minimo e massimo nelle colonne.Se l'unione trova un intervallo corrispondente per l'articolo, la spedizione corrispondente la quota può essere restituita nei risultati. Come con il metodo tradizionale di join di uguaglianza, un join di non uguaglianza può essere eseguito in una clausola WHERE. Inoltre, la parola chiave JOIN può essere utilizzata con la clausola ON per specificare le colonne rilevanti per il join.

SELECT E.first_name,
            J.job_hisal,
            J.job_losal,
            E.salary
     FROM employees E JOIN job_sal J
     ON (E.salary BETWEEN J.job_losal AND J.job_losal);

Possiamo utilizzare tutti i parametri di confronto discussi in precedenza come gli operatori di uguaglianza e disuguaglianza, BETWEEN, IS NULL, IS NOT NULL e RELATIONAL.

Outer Joins

Un Outer Join viene utilizzato per identificare le situazioni in cui le righe di una tabella non corrispondono alle righe di una seconda tabella, anche se le due tabelle sono correlate.

Esistono tre tipi di join esterni: LEFT, RIGHT e FULL OUTER JOIN. Iniziano tutti con un INNER JOIN, quindi aggiungono alcune delle righe che sono state eliminate. UN LEFT OUTER JOIN aggiunge di nuovo tutte le righe rilasciate dalla prima tabella (sinistra) nella condizione di join e le colonne di output dalla seconda tabella (destra) sono impostate su NULL. UN RIGHT OUTER JOIN aggiunge di nuovo tutte le righe rilasciate dalla seconda tabella (destra) nella condizione di join e le colonne di output dalla prima tabella (sinistra) sono impostate su NULL. FULL OUTER JOIN aggiunge tutte le righe eliminate da entrambe le tabelle.

Right Outer Join

UN RIGHT OUTER JOIN aggiunge di nuovo tutte le righe rilasciate dalla seconda tabella (destra) nella condizione di join e le colonne di output dalla prima tabella (sinistra) sono impostate su NULL. Notare che la query seguente elenca i dipendenti ei loro reparti corrispondenti. Inoltre nessun dipendente è stato assegnato al dipartimento 30.

SELECT E.first_name, E.salary, D.department_id          
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Join esterno sinistro

UN LEFT OUTER JOIN aggiunge di nuovo tutte le righe rilasciate dalla prima tabella (sinistra) nella condizione di join e le colonne di output dalla seconda tabella (destra) sono impostate su NULL. La query mostrata sopra può essere utilizzata per dimostrare il join esterno sinistro, scambiando la posizione del segno (+).

SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE   D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Join esterno completo

FULL OUTER JOIN aggiunge di nuovo tutte le righe eliminate da entrambe le tabelle. Sotto la query mostra gli elenchi dei dipendenti e dei loro reparti. Si noti che al dipendente "MAN" non è stato assegnato alcun reparto fino ad ora (è NULL) e al reparto 30 non è stato assegnato alcun dipendente.

SELECT  nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;

FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN        -
JOHN       10
EDWIN      20
MILLER     10
MARTIN     20
-          30

6 rows selected.

Prodotto cartesiano o Cross join

Per due entità A e B, A * B è noto come prodotto cartesiano. Un prodotto cartesiano è costituito da tutte le possibili combinazioni delle righe di ciascuna delle tabelle. Pertanto, quando una tabella con 10 righe viene unita a una tabella con 20 righe, il prodotto cartesiano è di 200 righe (10 * 20 = 200) .Ad esempio, unendo la tabella dei dipendenti con otto righe e la tabella del reparto con tre righe produrrà una tabella di prodotti cartesiani di 24 righe (8 * 3 = 24).

Il cross join si riferisce al prodotto cartesiano di due tabelle. Produce prodotto incrociato di due tabelle. La query precedente può essere scritta utilizzando la clausola CROSS JOIN.

Una tabella dei risultati dei prodotti cartesiani normalmente non è molto utile. In effetti, una tale tabella dei risultati può essere terribilmente fuorviante. Se esegui la query seguente per le tabelle EMPLOYEES e DEPARTMENTS, la tabella dei risultati implica che ogni dipendente ha una relazione con ogni reparto e sappiamo che semplicemente non è così!

SELECT E.first_name, D.DNAME
FROM employees E,departments D;
Il cross join può essere scritto come,
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;