Créer manuellement des jointures réflexives (Visual Database Tools)
S'applique à : SQL Server
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 remplacer la seconde condition de jointure « différent de » par « inférieur à ». La requête résultante peut être similaire à celle-ci :
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 ressemble alors à ceci :
Cheryl Carson Abraham Bennet
Pour créer manuellement une jointure réflexive
Ajoutez au volet Schéma la table ou l’objet table que vous souhaitez utiliser.
Ajoutez de nouveau la même table, afin que le volet Schéma affiche deux fois la même table ou le même 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, puis 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. Indiquez par exemple l’opérateur 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
Créer automatiquement des jointures réflexives (Visual Database Tools)
Interroger avec des jointures (Visual Database Tools)