417 votes

Comment sélectionner des lignes sans entrée correspondante dans une autre table ?

J'effectue quelques travaux de maintenance sur une application de base de données et j'ai découvert que, joie des joies, même si les valeurs d'une table sont utilisées dans le style des clés étrangères, il n'y a pas de contraintes de clé étrangère sur les tables.

J'essaie d'ajouter des contraintes FK sur ces colonnes, mais je me rends compte que, parce qu'il y a déjà tout un tas de mauvaises données dans les tables provenant d'erreurs précédentes qui ont été naïvement corrigées, je dois trouver les lignes qui ne correspondent pas à l'autre table, puis les supprimer.

J'ai trouvé quelques exemples de ce type de requête sur le web, mais ils semblent tous fournir des exemples plutôt que des explications, et je ne comprends pas pourquoi ils fonctionnent.

Quelqu'un peut-il m'expliquer comment construire une requête qui renvoie toutes les lignes qui n'ont pas de correspondance dans une autre table, et ce qu'elle fait, de sorte que je puisse faire ces requêtes moi-même, plutôt que de courir à SO pour chaque table dans ce désordre qui n'a pas de contraintes FK ?

-6voto

user6341745 Points 37

Comment sélectionner des lignes sans entrée correspondante dans le tableau des deux types ?

    select \* from \[dbo\].\[EmppDetails\] e
     right join \[Employee\].\[Gender\] d on e.Gid=d.Gid
    where e.Gid is Null

    union 
    select \* from \[dbo\].\[EmppDetails\] e
     left join \[Employee\].\[Gender\] d on e.Gid=d.Gid
    where d.Gid is Null

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X