Partager via


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

Autres ressources

Spécification de critères de recherche