Condividi tramite


JOIN

Si applica a: segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime

Combina le righe di due riferimenti di tabella in base ai criteri di join.

Sintassi

left_table_reference { [ join_type ] JOIN right_table_reference join_criteria |
           NATURAL join_type JOIN right_table_reference |
           CROSS JOIN right_table_reference }

join_type
  { [ INNER ] |
    LEFT [ OUTER ] |
    [ LEFT ] SEMI |
    RIGHT [ OUTER ] |
    FULL [ OUTER ] |
    [ LEFT ] ANTI |
    CROSS }

join_criteria
  { ON boolean_expression |
    USING ( column_name [, ...] ) }

Parametri

  • left_table_reference

    Riferimento di tabella sul lato sinistro del join.

  • right_table_reference

    Riferimento alla tabella sul lato destro del join.

  • join_type

    Tipo di join.

    • [ INNER ]

      Restituisce le righe con valori corrispondenti in entrambi i riferimenti alla tabella. Tipo di join predefinito.

    • LEFT [ OUTER ]

      Restituisce tutti i valori del riferimento alla tabella sinistra e i valori corrispondenti dal riferimento alla tabella destra oppure aggiunge NULL se non esiste alcuna corrispondenza. Si parla anche di left outer join.

    • RIGHT [ OUTER ]

      Restituisce tutti i valori del riferimento alla tabella destra e i valori corrispondenti dal riferimento alla tabella a sinistra oppure accoda NULL se non esiste alcuna corrispondenza. Viene anche definito right outer join.

    • FULL [OUTER]

      Restituisce tutti i valori di entrambe le relazioni, aggiungendo NULL valori sul lato che non hanno una corrispondenza. Viene anche definito full outer join.

    • [ LEFT ] MEZZO

      Restituisce valori dal lato sinistro del riferimento alla tabella con una corrispondenza con la destra. Viene anche definito semi join sinistro.

    • [ LEFT ] ANTI

      Restituisce i valori del riferimento di tabella a sinistra che non hanno alcuna corrispondenza con il riferimento alla tabella destra. Viene anche definito anti join a sinistra.

  • CROSS JOIN

    Restituisce il prodotto cartesiano di due relazioni.

  • NATURAL

    Specifica che le righe delle due relazioni verranno confrontate in modo implicito sull'uguaglianza per tutte le colonne con nomi corrispondenti.

  • join_criteria

    Specifica il modo in cui le righe di un riferimento a una tabella vengono combinate con le righe di un altro riferimento alla tabella.

    • ON boolean_expression

      Espressione con un tipo restituito booleano che specifica la corrispondenza delle righe delle due relazioni. Se il risultato è true, le righe vengono considerate una corrispondenza.

    • USING ( column_name [, ...] )

      Corrisponde alle righe confrontando l'uguaglianza per l'elenco di colonne column_name che devono esistere in entrambe le relazioni.

  • table_alias

    Nome temporaneo con un elenco di identificatori di colonna facoltativo.

Note

Quando si specifica USING o NATURAL, SELECT * verrà visualizzata una sola occorrenza per ognuna delle colonne usate per la corrispondenza prima, seguita dalle colonne di sinistra, quindi dalle tabelle di join destro escluse le colonne unite in join.

SELECT * FROM left JOIN right USING (a, b)

equivale a

SELECT left.a, left.b,
       left.* EXCEPT(a, b),
       right.* EXCEPT(a, b)
  FROM left JOIN right ON left.a = right.a AND left.b = right.b

Se si omette la join_criteria semantica di un join_type oggetto diventa quella di un oggetto CROSS JOIN.

Esempi

-- Use employee and department tables to demonstrate different type of joins.
> CREATE TEMP VIEW employee(id, name, deptno) AS
     VALUES(105, 'Chloe', 5),
           (103, 'Paul' , 3),
           (101, 'John' , 1),
           (102, 'Lisa' , 2),
           (104, 'Evan' , 4),
           (106, 'Amy'  , 6);

> CREATE TEMP VIEW department(deptno, deptname) AS
    VALUES(3, 'Engineering'),
          (2, 'Sales'      ),
          (1, 'Marketing'  );

-- Use employee and department tables to demonstrate inner join.
> SELECT id, name, employee.deptno, deptname
   FROM employee
   INNER JOIN department ON employee.deptno = department.deptno;
 103  Paul      3 Engineering
 101  John      1   Marketing
 102  Lisa      2       Sales

-- Use employee and department tables to demonstrate left join.
> SELECT id, name, employee.deptno, deptname
   FROM employee
   LEFT JOIN department ON employee.deptno = department.deptno;
 105 Chloe      5        NULL
 103  Paul      3 Engineering
 101  John      1   Marketing
 102  Lisa      2       Sales
 104  Evan      4        NULL
 106   Amy      6        NULL

-- Use employee and department tables to demonstrate right join.
> SELECT id, name, employee.deptno, deptname
    FROM employee
    RIGHT JOIN department ON employee.deptno = department.deptno;
 103  Paul      3 Engineering
 101  John      1   Marketing
 102  Lisa      2       Sales

-- Use employee and department tables to demonstrate full join.
> SELECT id, name, employee.deptno, deptname
    FROM employee
    FULL JOIN department ON employee.deptno = department.deptno;
 101  John      1   Marketing
 106   Amy      6        NULL
 103  Paul      3 Engineering
 105 Chloe      5        NULL
 104  Evan      4        NULL
 102  Lisa      2       Sales

-- Use employee and department tables to demonstrate cross join.
> SELECT id, name, employee.deptno, deptname
    FROM employee
    CROSS JOIN department;
 105 Chloe      5 Engineering
 105 Chloe      5   Marketing
 105 Chloe      5       Sales
 103  Paul      3 Engineering
 103  Paul      3   Marketing
 103  Paul      3       Sales
 101  John      1 Engineering
 101  John      1   Marketing
 101  John      1       Sales
 102  Lisa      2 Engineering
 102  Lisa      2   Marketing
 102  Lisa      2       Sales
 104  Evan      4 Engineering
 104  Evan      4   Marketing
 104  Evan      4       Sales
 106   Amy      4 Engineering
 106   Amy      4   Marketing
 106   Amy      4       Sales

-- Use employee and department tables to demonstrate semi join.
> SELECT *
    FROM employee
    SEMI JOIN department ON employee.deptno = department.deptno;
 103  Paul      3
 101  John      1
 102  Lisa      2

-- Use employee and department tables to demonstrate anti join.
> SELECT *
    FROM employee
    ANTI JOIN department ON employee.deptno = department.deptno;
 105 Chloe      5
 104  Evan      4
 106   Amy      6

-- Use employee and department tables to demonstrate lateral inner join.
> SELECT id, name, deptno, deptname
    FROM employee
    JOIN LATERAL (SELECT deptname
                    FROM department
                    WHERE employee.deptno = department.deptno);
 103 Paul    3  Engineering
 101 John    1  Marketing
 102 Lisa    2  Sales

-- Use employee and department tables to demonstrate lateral left join.
> SELECT id, name, deptno, deptname
    FROM employee
    LEFT JOIN LATERAL (SELECT deptname
                         FROM department
                         WHERE employee.deptno = department.deptno);
 105 Chloe   5      NULL
 103 Paul    3      Engineering
 101 John    1      Marketing
 102 Lisa    2      Sales
 104 Evan    4      NULL
 106 Amy     6      NULL