JOIN (SQL داتابريك)

يجمع بين صفوف من العلاقات اثنين استنادا إلى معايير الصلة.

بناء الجملة

relation { [ join_type ] JOIN relation join_criteria |
           NATURAL join_type JOIN relation |
           CROSS JOIN relation }

relation
 { table_name [ table_alias ] |
   view_name [ table_alias ] |
   [ LATERAL ] ( query ) [ table_alias ] |
   ( JOIN clause ) [ table_alias ] |
   VALUES clause |
   table_valued_function [ table_alias ] }

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

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

المعلمات

  • علاقه

    العلاقات التي سيتم الانضمام إليها.

    • table_name

      مرجع إلى جدول أو طريقة عرض أو تعبير جدول شائع (CTE).

    • view_name

      مرجع إلى طريقة عرض أو تعبير جدول شائع (CTE).

    • [ الجانبي ] ( استعلام )

      أي استعلام متداخل. استعلام بادئة بواسطة LATERAL قد تشير إلى أعمدة كشفها s السابقة في نفس from_itemFROM الجملة. يسمى هذا البناء صلة مرتبطة أو تابعة. لا يمكن أن يكون الصلة المرتبطة أو RIGHT OUTER JOINFULL OUTER JOIN .

    • ( بند الانضمام )

      استدعاء متداخلة من JOIN.

    • جملة القيم

      عبارة تنتج جدولا مؤقتا مضمنا.

    • دالة قيمة للجدول (TVF) (SQL Databricks)

      استدعاء دالة جدول.

  • join_type

    نوع الصلة.

    • [ INNER ]

      إرجاع الصفوف التي لها قيم مطابقة في كلا العلاقات. الصلة الافتراضية.

    • يسار [ الخارجي ]

      إرجاع كافة القيم من العلاقة اليسرى والقيم المتطابقة من العلاقة اليمنى، أو إلحاقها NULL إذا لم يكن هناك تطابق. ويشار إليه أيضا باسم الصلة الخارجية اليسرى.

    • اليمين [ الخارجي ]

      إرجاع كافة القيم من العلاقة اليمنى والقيم المتطابقة من العلاقة اليسرى، أو إلحاقها NULL إذا لم يكن هناك تطابق. ويشار إليه أيضا باسم الصلة الخارجية اليمنى.

    • كامل [الخارجي]

      إرجاع كافة القيم من كلا العلاقات، إلحاق NULL القيم على الجانب الذي لا يحتوي على تطابق. ويشار إليه أيضا باسم صلة خارجية كاملة.

    • [يسار] شبه

      إرجاع قيم من الجانب الأيمن من العلاقة التي لها تطابق مع اليمين. ويشار إليه أيضا باسم نصف صلة اليسار.

    • [يسار] مضاد

      إرجاع قيم من العلاقة اليمنى لا تتطابق مع اليمين. ويشار إليه أيضا باسم الانضمام إلى اليسار المضادة.

  • CROSS JOIN

    إرجاع المنتج الديكارتي لعلاقتين.

  • طبيعي

    تعين أن الصفوف من العلاقات اثنين ضمنيا سيتم مطابقتها على المساواة لكافة الأعمدة مع مطابقة الأسماء.

  • join_criteria

    تحديد كيفية دمج الصفوف من علاقة واحدة مع صفوف علاقة أخرى.

    • على boolean_expression

      تعبير مع نوع إرجاع من BOOLEAN الذي يحدد كيفية تطابق صفوف من العلاقات اثنين. إذا كانت النتيجة صحيحة تعتبر الصفوف مطابقة.

    • استخدام ( column_name [, ...] )

      يطابق الصفوف عن طريق مقارنة المساواة لقائمة الأعمدة column_name التي يجب أن توجد في كلا العلاقات.

      USING (c1, c2) هو مرادف ل ON rel1.c1 = rel2.c1 AND rel1.c2 = rel2.c2 .

  • table_alias

    اسم مؤقت مع قائمة معرف عمود اختياري.

ملاحظات

عند تحديد USING أو ، سيظهر تواجد واحد فقط لكل عمود من NATURALSELECT * الأعمدة المستخدمة لمطابقة.

إذا حذفت join_criteria دلالة أي join_type يصبح ذلك من CROSS JOIN .

أمثلة

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