Comment : créer manuellement des jointures réflexives
Vous pouvez joindre une table à elle-même même si elle ne possède pas de relation réflexive dans la base de données. Vous pouvez, par exemple, utiliser une jointure réflexive pour trouver des paires d'auteurs vivant dans la même ville.
À l'instar de toute autre jointure, une jointure réflexive nécessite au moins deux tables. En revanche, elle diffère des autres jointures par le fait que vous ajoutez une seconde instance de la même table plutôt qu'une autre table à la requête. Ainsi, vous pouvez comparer une colonne de la première instance de la table à la même colonne de la seconde, ce qui vous permet de comparer les valeurs d'une même colonne. Le Concepteur de requêtes et de vues assigne un alias à la seconde instance de la table.
Par exemple, si vous créez une jointure réflexive pour trouver toutes les paires d'auteurs résidant à Berkeley, comparez la colonne city de la première instance de la table à la colonne city de la seconde instance. La requête obtenue peut se présenter comme suit :
SELECT
authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM
authors
INNER JOIN
authors authors1
ON authors.city
= authors1.city
WHERE
authors.city = 'Berkeley'
La création d'une jointure réflexive exige souvent plusieurs conditions de jointure. Pour en comprendre les raisons, observez le résultat de la requête précédente :
Cheryl Carson Cheryl Carson
Abraham Bennet Abraham Bennet
Cheryl Carson Abraham Bennet
Abraham Bennet Cheryl Carson
La première ligne est sans importance, elle indique que Cheryl Carson vit dans la même ville que Cheryl Carson. La deuxième est tout aussi inutile. Pour éliminer les données inutiles, ajoutez une autre condition afin de ne conserver que les lignes de résultats affichant des noms d'auteur différents. La requête obtenue peut se présenter comme suit :
SELECT
authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM
authors
INNER JOIN
authors authors1
ON authors.city
= authors1.city
AND authors.au_id
<> authors1.au_id
WHERE
authors.city = 'Berkeley'
Le jeu de résultats est affiné :
Cheryl Carson Abraham Bennet
Abraham Bennet Cheryl Carson
Néanmoins, les deux lignes de résultats sont redondantes. La première indique que Carson vit dans la même ville que Bennet et la seconde que Bennet vit dans la même ville que Carson. Pour éliminer cette redondance, vous pouvez modifier la seconde condition de jointure « n'est pas égal à » en « inférieur à ». La requête obtenue peut se présenter comme suit :
SELECT
authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM
authors
INNER JOIN
authors authors1
ON authors.city
= authors1.city
AND authors.au_id
< authors1.au_id
WHERE
authors.city = 'Berkeley'
Le jeu de résultat ressemble alors à ceci :
Cheryl Carson Abraham Bennet
Notes
Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Utilisation des paramètres.
Pour créer manuellement une jointure réflexive
Ajoutez la table ou l'objet table que vous souhaitez utiliser dans le volet Schéma.
Ajoutez de nouveau la même table, afin que le volet Schéma affiche deux fois la même table ou objet table.
Le Concepteur de requêtes et de vues assigne un alias à la seconde instance en ajoutant un numéro séquentiel au nom de la table. Par ailleurs, il crée une ligne de jointure entre les deux occurrences de la table ou l'objet table dans le volet Schéma.
Cliquez avec le bouton droit sur la ligne de jointure et cliquez sur Propriétés dans le menu contextuel.
Dans la fenêtre Propriétés, cliquez sur Condition et type de jointure et cliquez sur le bouton de sélection (...), à droite de la propriété.
Dans la boîte de dialogue Joindre, modifiez éventuellement l'opérateur de comparaison entre les clés primaires. Modifiez par exemple l'opérateur en inférieur à (<).
Créez la condition de jointure supplémentaire (par exemple, authors.zip = authors1.zip) en faisant glisser le nom de la colonne de jointure primaire figurant dans la première occurrence de la table ou de l'objet table jusqu'à la colonne correspondante de la seconde occurrence.
Spécifiez d'autres options de requête comme les colonnes de sortie, les conditions de recherche et l'ordre de tri.
Voir aussi
Tâches
Comment : créer automatiquement des jointures réflexives