JOIN

Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime

Kombinuje řádky z odkazu předchozího left_table s odkazem right_table na základě kritérií spojení.

Syntaxe

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

    Odkaz na tabulku na pravé straně spojení.

  • join_type

    Typ spojení.

    • [ VNITŘNÍ ]

      Vrátí řádky, které mají odpovídající hodnoty v obou odkazech na tabulku. Výchozí typ spojení.

    • LEFT [ VNĚJŠÍ ]

      Vrátí všechny hodnoty z odkazu na levou tabulku a odpovídající hodnoty z pravého odkazu na tabulku nebo připojí NULL, pokud neexistuje shoda. Označuje se také jako levé vnější spojení .

    • RIGHT [ VNĚJŠÍ ]

      Vrátí všechny hodnoty z pravého odkazu na tabulku a odpovídající hodnoty z odkazu na levou tabulku nebo připojí NULL, pokud neexistuje žádná shoda. Označuje se také jako pravý vnější spoj.

    • PLNÁ [VNĚJŠÍ]

      Vrátí všechny hodnoty z obou relací a doplní hodnoty NULL na straně, která nemá shodu. Označuje se také jako úplné vnější spojení .

    • [ VLEVO ] POLO

      Vrátí hodnoty z levé strany referenční tabulky, které mají shodu s pravou. Označuje se také jako levé polopřipojení.

    • [ VLEVO ] ANTI

      Vrátí hodnoty z odkazu na levou tabulku, které nemají žádnou shodu s odkazem na správnou tabulku. Označuje se také jako levý anti join.

  • KŘÍŽ JOIN

    Vrátí kartézský součin dvou vztahů.

  • PŘIROZENÝ

    Určuje, že řádky ze dvou relací budou implicitně porovnávány na základě rovnosti pro všechny sloupce se shodnými názvy.

    Kombinování NATURAL s CROSS nebo LATERAL není podporováno. Azure Databricks zvýší INCOMPATIBLE_JOIN_TYPES.

  • join_criteria

    Volitelně určuje, jak se řádky z jednoho odkazu na tabulku zkombinují s řádky jiného odkazu na tabulku.

    Varování

    Pokud vynecháte join_criteria sémantický sémantický z jakéhokoliv join_type se stane tím CROSS JOIN, že .

    • ZAPNUTO boolean_expression

      Výraz s návratovým typem logické hodnoty, který určuje, jak se řádky ze dvou relací shodují. Pokud je výsledek pravdivý, považuje se řádky za shodu.

      Pokud se výraz nevyhodnotí jako BOOLEAN, Azure Databricks vyvolá JOIN_CONDITION_IS_NOT_BOOLEAN_TYPE.

    • USING ( column_name [; ...] )

      Porovná řádky porovnáním rovnosti pro seznam sloupců column_name, které musí existovat v obou relacích.

      Pokud se sloupec nenajde v některé z relací, Azure Databricks vyvolá UNRESOLVED_USING_COLUMN_FOR_JOIN.

  • table_alias

    Dočasný název se seznamem volitelných identifikátorů sloupců.

Běžné chybové podmínky

Notes

Když zadáte USING nebo NATURAL, SELECT * zobrazí pouze jeden výskyt pro každý sloupec použitý k nalezení první shody, následované sloupci z levého, a poté pravého spojení tabulek s výjimkou sloupců použitých ke spojení.

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

je ekvivalentem

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

Příklady

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

-- `USING` column not found.
> SELECT * FROM employee JOIN department USING (name);
  Error: UNRESOLVED_USING_COLUMN_FOR_JOIN

-- Join condition is not a `BOOLEAN`.
> SELECT * FROM employee JOIN department ON 1;
  Error: JOIN_CONDITION_IS_NOT_BOOLEAN_TYPE

-- `NATURAL CROSS JOIN` is not supported.
> SELECT * FROM employee NATURAL CROSS JOIN department;
  Error: INCOMPATIBLE_JOIN_TYPES