Utilisation d'une table deux fois dans la même requête
Il est possible d'utiliser la même table plusieurs fois dans une requête. Plusieurs situations se prêtent à cette utilisation.
Création d'une jointure réflexive avec relation réflexive En établissant une relation réflexive, vous pouvez joindre une table à elle-même — c'est-à-dire que la colonne de clé étrangère à laquelle il est fait référence et la colonne de clé primaire référencée se trouvent dans la même table. par exemple, supposez que la table des employés contient une colonne supplémentaire, employee.manager_emp_id, et qu'une clé étrangère de manager_emp_id à employee.emp_id existe. Dans chaque ligne de la table d'employés, la colonne manager_emp_id indique le patron de l'employé. Plus précisément, elle indique l'ID d'employé du responsable hiérarchique.
Une jointure réflexive de la table permettra d'obtenir un ensemble de résultats où chaque ligne contiendra le nom d'un responsable hiérarchique et le nom d'un de ses employés. L'instruction SQL obtenue peut se présenter de la manière suivante :
SELECT boss.lname, boss.fname, employee.lname, employee.fname FROM employee INNER JOIN employee boss ON employee.manager_emp_id = boss.emp_id
Pour plus d'informations sur la création de jointures utilisant des relations réflexives, consultez Comment : créer automatiquement des jointures réflexives.
Création d'une jointure réflexive sans relation réflexive Il est possible de demander une jointure de la table avec elle-même sans utiliser de relation réflexive. Par exemple, il est possible de demander que, dans l'ensemble des résultats, chaque ligne décrive un employé et le cadre qui pourrait lui servir de conseiller. (Un conseiller est un employé occupant une fonction plus élevée.) L'instruction SQL obtenue peut se présenter de la manière suivante :
SELECT employee.fname, employee.lname, mentor.fname, mentor.lname FROM employee INNER JOIN employee mentor ON employee.job_lvl < mentor.job_lvl
La jointure utilise une condition qui n'est pas une condition d'égalité. Pour plus d'informations sur les jointures de tables utilisant d'autres conditions que l'égalité, consultez Opérateurs de comparaison pour une jointure.
Pour plus d'informations sur la création de jointures réflexives utilisant des colonnes sans relation, consultez Comment : créer manuellement des jointures réflexives.
Utilisation répétée d'une table sans jointure réflexive Même sans jointure réflexive, il est possible d'utiliser plusieurs fois la même table dans une requête. Par exemple, vous pourriez demander un ensemble de résultats contenant les autres ouvrages écrits par le ou les auteurs de votre livre préféré. Dans ce cas, la table titleauthors est utilisée deux fois — une fois pour trouver les auteurs de votre livre favori (dans l'exemple, Is Anger the Enemy?) et une fois pour trouver les autres ouvrages du même auteur. L'instruction SQL obtenue peut se présenter de la manière suivante :
SELECT other_title.title FROM titles favorite_title INNER JOIN titleauthor favorite_titleauthor ON favorite_title.title_id = favorite_titleauthor.title_id INNER JOIN authors ON favorite_titleauthor.au_id = authors.au_id INNER JOIN titleauthor other_titleauthor ON authors.au_id = other_titleauthor.au_id INNER JOIN titles other_title ON other_titleauthor.title_id = other_title.title_id WHERE favorite_title.title = 'Is Anger the Enemy?' AND favorite_title.title <> other_title.title
Notes
Pour faire une distinction entre les différentes utilisations de la même table, la requête ci-dessus utilise les alias suivants : favorite_title, favorite_titleauthor, other_titleauthor et other_title. Pour plus d'informations sur les alias, consultez Comment : créer des alias de tables.
Voir aussi
Concepts
Utilisation de données du volet Résultats