Udostępnij za pośrednictwem


JOIN

Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime

Łączy wiersze z poprzedniego left_table odwołania z odwołaniem right_table na podstawie kryteriów sprzężenia.

Składnia

{ [ 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 [, ...] ) }

Parametry

  • right_table_reference

    Odwołanie do tabeli po prawej stronie łączenia.

  • join_type

    Typ sprzężenia.

    • [ WEWNĘTRZNY ]

      Zwraca wiersze, które mają pasujące wartości w obu odwołaniach do tabeli. Domyślny typ sprzężenia.

    • LEWA [ ZEWNĘTRZNA ]

      Zwraca wszystkie wartości z odwołania do lewej tabeli i dopasowane wartości z odwołania do prawej tabeli lub dołącza NULL, jeśli nie ma dopasowania. Jest on nazywany również zewnętrznym lewym sprzężeniem .

    • PRAWO [ ZEWNĘTRZNE ]

      Zwraca wszystkie wartości z odwołania do prawej tabeli i dopasowane wartości z odwołania do lewej tabeli lub dołącza NULL, jeśli nie ma dopasowania. Jest on również określany jako prawe sprzężenie zewnętrzne.

    • PEŁNE [ZEWNĘTRZNE]

      Zwraca wszystkie wartości z obu relacji, dodając wartości NULL po stronie, która nie ma dopasowania. Jest on również określany jako pełne sprzężenie zewnętrzne.

    • [ LEWA ] PÓŁ

      Zwraca wartości z lewej strony tabeli, które mają odpowiedniki po stronie prawej. Jest on również nazywany lewym półsprzężeniem .

    • [ LEWA ] ANTY

      Zwraca wartości z odwołania do tabeli po lewej stronie, które nie są zgodne z odpowiednim odwołaniem do tabeli. Jest również nazywany lewym antysprzężeniem.

  • KRZYŻ JOIN

    Zwraca kartezjański produkt dwóch stosunków.

  • NATURALNY

    Określa, że wiersze z dwóch relacji będą automatycznie dopasowywane na podstawie równości dla wszystkich kolumn o pasujących nazwach.

  • join_criteria

    Określa, jak wiersze z jednego odwołania do tabeli są opcjonalnie łączone z wierszami z innego odwołania do tej tabeli.

    Ostrzeżenie

    Jeśli pominięto join_criteria semantykę dowolnego join_type obiektu, staje się elementem CROSS JOIN.

    • ON boolean_expression

      Wyrażenie z zwracanym typem wartości logicznej, które określa, jak są dopasowywane wiersze z dwóch relacji. Jeśli wynik ma wartość true, wiersze są traktowane jako zgodne.

    • USING ( column_name [, ...] )

      Dopasowanie wierszy poprzez porównanie równości dla listy kolumn column_name, które muszą istnieć w obu relacjach.

  • table_alias

    Nazwa tymczasowa z opcjonalną listą identyfikatorów kolumn.

Uwagi

Po określeniu USING lub NATURAL, SELECT * będzie pokazywać tylko jedno wystąpienie dla każdej kolumny używanej do dopasowania, najpierw dla kolumn po lewej stronie, a potem po prawej stronie tabel sprzężonych, z wyłączeniem kolumn użytych do łączenia.

SELECT * FROM first JOIN second USING (a, b)

jest równoważny

SELECT first.a, first.b,
       first.* EXCEPT(a, b),
       second.* EXCEPT(a, b)
  FROM first JOIN second ON first.a = second.a AND first.b = second.b

Przykłady

-- 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