Dela via


JOIN

Gäller för:markerad ja Databricks SQL markerad ja Databricks Runtime

Kombinerar raderna från två table-referenser baserat på join kriterier.

Syntax

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

Parameters

  • left_table_reference

    Referensen table på den vänstra sidan av join.

  • right_table_reference

    Referensen table till höger om join.

  • join_type

    join-typ.

    • [ INRE ]

      Returnerar de rader som har matchande values i båda table referenser. Standardvärdet join-type.

    • VÄNSTER [ YTTRE ]

      Returnerar alla values från den vänstra table referensen och den matchade values från den högra table referensen, eller lägger till NULL om det inte finns någon matchning. Det kallas även för en vänster yttre join.

    • HÖGER [ YTTRE ]

      Returnerar alla values från den högra table referensen och den matchade values från den vänstra table referensen, eller lägger till NULL om det inte finns någon matchning. Det kallas även för en höger yttre join.

    • FULL [YTTRE]

      Returnerar alla values från båda relationerna och lägger till NULLvalues på sidan som inte har någon matchning. Det kallas även för en fullständig yttre join.

    • [ VÄNSTER ] SEMI

      Returnerar values från vänster sida av den table referens som har en matchning med höger. Det kallas också för en vänster semi join.

    • [ VÄNSTER ] ANTI

      Returnerar values från vänster table referens som inte har någon matchning med den högra table referensen. Det kallas även för vänster anti-join.

  • CROSS JOIN

    Returnerar den kartesiska produkten av två relationer.

  • NATURLIG

    Anger att raderna från de två relationerna implicit matchas vid likhet för alla columns med matchande namn.

  • join_criteria

    Du kan också ange hur raderna från en table referens kombineras med raderna i en annan table referens.

    Varning

    Om du utelämnar semantiken join_criteria för någon join_type blir det för en CROSS JOIN.

    • PÅ boolean_expression

      Ett uttryck med returtypen BOOLEAN som anger hur rader från de två relationerna matchas. Om resultatet är sant betraktas raderna som en matchning.

    • USING ( column_name [, ...] )

      Matchar raderna genom att jämföra likheten för list av columnscolumn_name som måste finnas i båda relationerna.

  • table_alias

    Ett tillfälligt namn med en valfri columnidentifierlist.

Kommentar

När du anger USING eller NATURALvisar SELECT * bara en förekomst för var och en av de columns som används för att matcha först, följt av columns till vänster, sedan höger jointables, med undantag för columns som de är anslutna på.

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

motsvarar

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

Exempel

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