HiveQL - Select-Joins

JOIN è una clausola utilizzata per combinare campi specifici di due tabelle utilizzando valori comuni a ciascuna di esse. Viene utilizzato per combinare i record di due o più tabelle nel database.

Sintassi

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]

Esempio

Useremo le seguenti due tabelle in questo capitolo. Considera la seguente tabella denominata CUSTOMERS ..

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

Considera un'altra tabella ORDINI come segue:

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

Esistono diversi tipi di join indicati come segue:

  • JOIN
  • UNISCI ESTERNO SINISTRO
  • GIUSTO ESTERNO UNISCI
  • FULL OUTER JOIN

ADERIRE

La clausola JOIN viene utilizzata per combinare e recuperare i record da più tabelle. JOIN è uguale a OUTER JOIN in SQL. Una condizione JOIN deve essere generata utilizzando le chiavi primarie e le chiavi esterne delle tabelle.

La seguente query esegue JOIN sulle tabelle CUSTOMER e ORDER e recupera i record:

hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT 
FROM CUSTOMERS c JOIN ORDERS o 
ON (c.ID = o.CUSTOMER_ID);

In caso di corretta esecuzione della query, viene visualizzata la seguente risposta:

+----+----------+-----+--------+ 
| ID | NAME     | AGE | AMOUNT | 
+----+----------+-----+--------+ 
| 3  | kaushik  | 23  | 3000   | 
| 3  | kaushik  | 23  | 1500   | 
| 2  | Khilan   | 25  | 1560   | 
| 4  | Chaitali | 25  | 2060   | 
+----+----------+-----+--------+

UNISCI ESTERNO SINISTRO

HiveQL LEFT OUTER JOIN restituisce tutte le righe della tabella di sinistra, anche se non sono presenti corrispondenze nella tabella di destra. Ciò significa che se la clausola ON corrisponde a 0 (zero) record nella tabella di destra, JOIN restituisce ancora una riga nel risultato, ma con NULL in ogni colonna della tabella di destra.

A LEFT JOIN restituisce tutti i valori dalla tabella di sinistra, più i valori corrispondenti dalla tabella di destra, o NULL in caso di nessun predicato JOIN corrispondente.

La seguente query mostra LEFT OUTER JOIN tra le tabelle CUSTOMER e ORDER:

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE 
FROM CUSTOMERS c 
LEFT OUTER JOIN ORDERS o 
ON (c.ID = o.CUSTOMER_ID);

In caso di corretta esecuzione della query, viene visualizzata la seguente risposta:

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

GIUSTO ESTERNO UNISCI

HiveQL RIGHT OUTER JOIN restituisce tutte le righe della tabella di destra, anche se non sono presenti corrispondenze nella tabella di sinistra. Se la clausola ON corrisponde a 0 (zero) record nella tabella di sinistra, il JOIN restituisce ancora una riga nel risultato, ma con NULL in ogni colonna della tabella di sinistra.

Un RIGHT JOIN restituisce tutti i valori dalla tabella di destra, più i valori corrispondenti dalla tabella di sinistra, o NULL in caso di nessun predicato di join corrispondente.

La seguente query mostra RIGHT OUTER JOIN tra le tabelle CUSTOMER e ORDER.

notranslate "> hive> SELEZIONA c.ID, c.NAME, o.AMOUNT, o.DATE DAI CLIENTI c DIRITTO OUTER JOIN ORDERS o ON (c.ID = o.CUSTOMER_ID);

In caso di corretta esecuzione della query, viene visualizzata la seguente risposta:

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

FULL OUTER JOIN

HiveQL FULL OUTER JOIN combina i record delle tabelle esterne sinistra e destra che soddisfano la condizione JOIN. La tabella unita contiene tutti i record di entrambe le tabelle oppure inserisce valori NULL per le corrispondenze mancanti su entrambi i lati.

La seguente query mostra FULL OUTER JOIN tra le tabelle CUSTOMER e ORDER:

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE 
FROM CUSTOMERS c 
FULL OUTER JOIN ORDERS o 
ON (c.ID = o.CUSTOMER_ID);

In caso di corretta esecuzione della query, viene visualizzata la seguente risposta:

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