Question

SQL Server 2005.

J'ajoute des contraintes de clé étrangère à la base de données d'une application qui n'en aurait apparemment pas besoin. Naturellement, les données ne sont plus fiables et il existe des entrées orphelines dans le champ Clé étrangère.

Configuration:
Deux tables, TableUser et TableOrder. TableUser a la clé primaire 'UserID' et TableOrder a la clé étrangère 'UserID'.

Comment trouver les lignes où TableOrder.UserID n'a pas d'entrée correspondante dans TableUser.UserID?

Par exemple, TableOrder.UserID a une valeur de 250, mais il n'y a pas de clé TableUser.UserID correspondante pour 250.

Était-ce utile?

La solution

Voici un moyen:

select * from TableOrder where UserID not in (select UserID from TableUser);

Il existe de nombreuses façons d'écrire ce type de requête.

Autres conseils

L’autre approche courante est une jointure gauche-extérieure:

SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL

Cette requête peut également être utile sans la clause where pour parcourir et afficher les valeurs correspondantes (le cas échéant) et déterminer celles qui ne correspondent pas.

Il n'y avait aucune contrainte FK dans les tableaux pour commencer. Ils étaient utilisés comme FK et PK mais sans code - la conviction était qu’ils étaient inutiles. Nous avons donc toutes les colonnes, mais pas de contraintes codées. Quand je suis allé les mettre en place pour qu'ils soient appliqués, j'ai découvert qu'il y avait beaucoup de violations.

Votre question met en évidence le problème. Ce ne sont pas des frais généraux inutiles, ils empêchent les utilisateurs d’utiliser une base de données générale.

Les réponses de Greg et Brad m'ont aidé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top