PostgreSQL - PARTECIPA

Il PostgreSQL Joinsviene utilizzata per combinare i record di due o più tabelle in un database. Un JOIN è un mezzo per combinare i campi di due tabelle utilizzando valori comuni a ciascuna.

I tipi di join in PostgreSQL sono:

  • La CROCE JOIN
  • L'INNER JOIN
  • L'UNIONE ESTERNA SINISTRA
  • L'UNIONE ESTERNA DESTRA
  • Il FULL OUTER JOIN

Prima di procedere, consideriamo due tabelle, AZIENDA e REPARTO. Abbiamo già visto le istruzioni INSERT per popolare la tabella COMPANY. Quindi supponiamo che l'elenco dei record disponibili nella tabella AZIENDA -

id | name  | age | address   | salary | join_date
----+-------+-----+-----------+--------+-----------
  1 | Paul  |  32 | California|  20000 | 2001-07-13
  3 | Teddy |  23 | Norway    |  20000 |
  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13
  5 | David |  27 | Texas     |  85000 | 2007-12-13
  2 | Allen |  25 | Texas     |        | 2007-12-13
  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13
  9 | James |  44 | Norway    |   5000 | 2005-07-13
 10 | James |  45 | Texas     |   5000 | 2005-07-13

Un'altra tabella è DEPARTMENT, ha la seguente definizione:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Ecco l'elenco delle istruzioni INSERT per popolare la tabella DEPARTMENT -

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

Infine, abbiamo il seguente elenco di record disponibili nella tabella DEPARTMENT:

id | dept        | emp_id
----+-------------+--------
  1 | IT Billing  |  1
  2 | Engineering |  2
  3 | Finance     |  7

La CROCE JOIN

Un CROSS JOIN abbina ogni riga della prima tabella con ogni riga della seconda tabella. Se le tabelle di input hanno rispettivamente x e y colonne, la tabella risultante avrà x + y colonne. Poiché i CROSS JOIN hanno il potenziale per generare tabelle estremamente grandi, è necessario prestare attenzione a utilizzarli solo quando appropriato.

La seguente è la sintassi di CROSS JOIN -

SELECT ... FROM table1 CROSS JOIN table2 ...

Sulla base delle tabelle sopra, possiamo scrivere un CROSS JOIN come segue:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

La query sopra indicata produrrà il seguente risultato:

emp_id| name  |  dept
------|-------|--------------
    1 | Paul  | IT Billing
    1 | Teddy | IT Billing
    1 | Mark  | IT Billing
    1 | David | IT Billing
    1 | Allen | IT Billing
    1 | Paul  | IT Billing
    1 | James | IT Billing
    1 | James | IT Billing
    2 | Paul  | Engineering
    2 | Teddy | Engineering
    2 | Mark  | Engineering
    2 | David | Engineering
    2 | Allen | Engineering
    2 | Paul  | Engineering
    2 | James | Engineering
    2 | James | Engineering
    7 | Paul  | Finance
    7 | Teddy | Finance
    7 | Mark  | Finance
    7 | David | Finance
    7 | Allen | Finance
    7 | Paul  | Finance
    7 | James | Finance
    7 | James | Finance

L'INNER JOIN

UN INNER JOIN crea una nuova tabella dei risultati combinando i valori di colonna di due tabelle (table1 e table2) in base al predicato di join. La query confronta ogni riga di table1 con ogni riga di table2 per trovare tutte le coppie di righe che soddisfano il predicato di join. Quando il predicato di join è soddisfatto, i valori di colonna per ciascuna coppia di righe corrispondenti di table1 e table2 vengono combinati in una riga di risultati.

Un INNER JOIN è il tipo di join più comune ed è il tipo di join predefinito. Puoi utilizzare la parola chiave INNER facoltativamente.

Quanto segue è la sintassi di INNER JOIN -

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

Sulla base delle tabelle sopra, possiamo scrivere un INNER JOIN come segue:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

La query sopra indicata produrrà il seguente risultato:

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering

L'UNIONE ESTERNA SINISTRA

OUTER JOIN è un'estensione di INNER JOIN. Lo standard SQL definisce tre tipi di OUTER JOIN: LEFT, RIGHT e FULL e PostgreSQL supporta tutti questi.

In caso di LEFT OUTER JOIN, viene eseguito prima un inner join. Quindi, per ogni riga nella tabella T1 che non soddisfa la condizione di join con nessuna riga nella tabella T2, viene aggiunta una riga unita con valori nulli nelle colonne di T2. Pertanto, la tabella unita ha sempre almeno una riga per ogni riga in T1.

Quanto segue è la sintassi di LEFT OUTER JOIN -

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

Sulla base delle tabelle precedenti, possiamo scrivere un inner join come segue:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La query sopra indicata produrrà il seguente risultato:

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

L'UNIONE ESTERNA DESTRA

Innanzitutto, viene eseguita un'unione interna. Quindi, per ogni riga nella tabella T2 che non soddisfa la condizione di join con nessuna riga nella tabella T1, viene aggiunta una riga unita con valori nulli nelle colonne di T1. Questo è il contrario di un join sinistro; la tabella dei risultati avrà sempre una riga per ogni riga in T2.

Quanto segue è la sintassi di RIGHT OUTER JOIN -

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

Sulla base delle tabelle precedenti, possiamo scrivere un inner join come segue:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La query sopra indicata produrrà il seguente risultato:

emp_id | name  | dept
--------+-------+--------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance

Il FULL OUTER JOIN

Innanzitutto, viene eseguita un'unione interna. Quindi, per ogni riga nella tabella T1 che non soddisfa la condizione di join con nessuna riga nella tabella T2, viene aggiunta una riga unita con valori nulli nelle colonne di T2. Inoltre, per ogni riga di T2 che non soddisfa la condizione di join con alcuna riga in T1, viene aggiunta una riga unita con valori nulli nelle colonne di T1.

Quanto segue è la sintassi di FULL OUTER JOIN -

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

Sulla base delle tabelle precedenti, possiamo scrivere un inner join come segue:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La query sopra indicata produrrà il seguente risultato:

emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |