HiveQL - เลือกเข้าร่วม
JOIN เป็นประโยคที่ใช้สำหรับการรวมฟิลด์เฉพาะจากสองตารางโดยใช้ค่าร่วมกันของแต่ละตาราง ใช้เพื่อรวมระเบียนจากสองตารางขึ้นไปในฐานข้อมูล
ไวยากรณ์
join_table:
table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference
join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table_reference [join_condition]
ตัวอย่าง
เราจะใช้สองตารางต่อไปนี้ในบทนี้ พิจารณาตารางต่อไปนี้ชื่อลูกค้า ..
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
พิจารณาคำสั่งตารางอื่นดังนี้:
+-----+---------------------+-------------+--------+
|OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
การรวมมีหลายประเภทดังนี้:
- JOIN
- ซ้ายด้านนอกเข้าร่วม
- ขวาเข้าร่วม
- เข้าร่วมเต็มรูปแบบจากภายนอก
เข้าร่วม
JOIN clause ใช้เพื่อรวมและดึงข้อมูลจากหลายตาราง JOIN เหมือนกับ OUTER JOIN ใน SQL เงื่อนไขการเข้าร่วมคือการเพิ่มขึ้นโดยใช้คีย์หลักและคีย์ต่างประเทศของตาราง
แบบสอบถามต่อไปนี้ดำเนินการ JOIN บนตาราง CUSTOMER และ ORDER และเรียกข้อมูลระเบียน:
hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT
FROM CUSTOMERS c JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
เมื่อดำเนินการค้นหาสำเร็จคุณจะเห็นคำตอบต่อไปนี้:
+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
ซ้ายด้านนอกเข้าร่วม
HiveQL LEFT OUTER JOIN ส่งคืนแถวทั้งหมดจากตารางด้านซ้ายแม้ว่าจะไม่มีรายการที่ตรงกันในตารางด้านขวาก็ตาม ซึ่งหมายความว่าถ้าคำสั่ง ON ตรงกับระเบียน 0 (ศูนย์) ในตารางด้านขวา JOIN จะยังคงส่งคืนแถวในผลลัพธ์ แต่จะมีค่า NULL ในแต่ละคอลัมน์จากตารางด้านขวา
LEFT JOIN ส่งคืนค่าทั้งหมดจากตารางด้านซ้ายบวกค่าที่ตรงกันจากตารางด้านขวาหรือค่า NULL ในกรณีที่ไม่มีเพรดิเคต JOIN ที่ตรงกัน
แบบสอบถามต่อไปนี้แสดงให้เห็นถึงการเข้าร่วม LEFT ภายนอกระหว่างตารางลูกค้าและตารางการสั่งซื้อ:
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
LEFT OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
เมื่อดำเนินการค้นหาสำเร็จคุณจะเห็นคำตอบต่อไปนี้:
+----+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+----+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
+----+----------+--------+---------------------+
ขวาเข้าร่วม
HiveQL RIGHT OUTER JOIN ส่งคืนแถวทั้งหมดจากตารางด้านขวาแม้ว่าจะไม่มีรายการที่ตรงกันในตารางด้านซ้าย ถ้าส่วนคำสั่ง ON ตรงกับระเบียน 0 (ศูนย์) ในตารางด้านซ้าย JOIN จะยังคงส่งกลับแถวในผลลัพธ์ แต่มีค่า NULL ในแต่ละคอลัมน์จากตารางด้านซ้าย
RIGHT JOIN ส่งคืนค่าทั้งหมดจากตารางด้านขวาบวกกับค่าที่ตรงกันจากตารางด้านซ้ายหรือ NULL ในกรณีที่ไม่มีเพรดิเคตการรวมที่ตรงกัน
ข้อความค้นหาต่อไปนี้แสดงให้เห็นถึงการเข้าร่วมด้านนอกที่ถูกต้องระหว่างตาราง CUSTOMER และ ORDER
notranslate "> กลุ่ม> เลือก c.ID, c.NAME, o.AMOUNT, o วันที่จากลูกค้า c ขวาภายนอกเข้าร่วมคำสั่งซื้อ o บน (c.ID = o.CUSTOMER_ID);เมื่อดำเนินการค้นหาสำเร็จคุณจะเห็นคำตอบต่อไปนี้:
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
เข้าร่วมเต็มรูปแบบจากภายนอก
HiveQL FULL OUTER JOIN รวมบันทึกของตารางด้านนอกทั้งด้านซ้ายและด้านขวาที่เป็นไปตามเงื่อนไข JOIN ตารางที่เข้าร่วมประกอบด้วยระเบียนทั้งหมดจากทั้งสองตารางหรือเติมค่า NULL สำหรับการจับคู่ที่ขาดหายไปในด้านใดด้านหนึ่ง
แบบสอบถามต่อไปนี้แสดงให้เห็นถึงการเข้าร่วมเต็มรูปแบบจากภายนอกระหว่างตารางลูกค้าและตารางการสั่งซื้อ:
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
FULL OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
เมื่อดำเนินการค้นหาสำเร็จคุณจะเห็นคำตอบต่อไปนี้:
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+