HiveQL - Select-Joins

JOIN est une clause utilisée pour combiner des champs spécifiques de deux tables en utilisant des valeurs communes à chacune. Il est utilisé pour combiner des enregistrements de deux ou plusieurs tables de la base de données.

Syntaxe

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]

Exemple

Nous utiliserons les deux tableaux suivants dans ce chapitre. Considérez le tableau suivant nommé CLIENTS.

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

Considérez une autre table ORDERS comme suit:

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

Il existe différents types de jointures comme suit:

  • JOIN
  • JOINTURE EXTERNE GAUCHE
  • JOINTURE EXTÉRIEURE DROITE
  • JOINTURE EXTÉRIEURE COMPLÈTE

JOINDRE

La clause JOIN est utilisée pour combiner et récupérer les enregistrements de plusieurs tables. JOIN est identique à OUTER JOIN en SQL. Une condition JOIN doit être levée à l'aide des clés primaires et des clés étrangères des tables.

La requête suivante exécute JOIN sur les tables CUSTOMER et ORDER et récupère les enregistrements:

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

Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante:

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

JOINTURE EXTERNE GAUCHE

HiveQL LEFT OUTER JOIN renvoie toutes les lignes de la table de gauche, même s'il n'y a aucune correspondance dans la table de droite. Cela signifie que si la clause ON correspond à 0 (zéro) enregistrements dans la table de droite, la jointure renvoie toujours une ligne dans le résultat, mais avec NULL dans chaque colonne de la table de droite.

Un LEFT JOIN renvoie toutes les valeurs de la table de gauche, plus les valeurs correspondantes de la table de droite, ou NULL en cas d'absence de prédicat JOIN correspondant.

La requête suivante illustre LEFT OUTER JOIN entre les tables CUSTOMER et 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);

Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante:

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

JOINTURE EXTÉRIEURE DROITE

HiveQL RIGHT OUTER JOIN renvoie toutes les lignes de la table de droite, même s'il n'y a aucune correspondance dans la table de gauche. Si la clause ON correspond à 0 (zéro) enregistrements dans la table de gauche, la jointure renvoie toujours une ligne dans le résultat, mais avec NULL dans chaque colonne de la table de gauche.

Un RIGHT JOIN renvoie toutes les valeurs de la table de droite, plus les valeurs correspondantes de la table de gauche, ou NULL en cas d'absence de prédicat de jointure correspondant.

La requête suivante illustre RIGHT OUTER JOIN entre les tables CUSTOMER et ORDER.

notranslate "> hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE DES CLIENTS c RIGHT OUTER JOIN ORDERS o ON (c.ID = o.CUSTOMER_ID);

Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante:

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

JOINTURE EXTÉRIEURE COMPLÈTE

HiveQL FULL OUTER JOIN combine les enregistrements des tables externes gauche et droite qui remplissent la condition JOIN. La table jointe contient tous les enregistrements des deux tables ou remplit des valeurs NULL pour les correspondances manquantes de chaque côté.

La requête suivante montre une jointure externe complète entre les tables CUSTOMER et 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);

Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante:

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