5

SQL Server 2005.Comment rechercher des clés étrangères qui ne correspondent pas à leurs contraintes?

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

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

Comment puis-je trouver les lignes où TableOrder.UserID n'a pas d'entrée correspondant à TableUser.UserID?

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

+0

Une fois que vous les avez trouvés, que voulez-vous faire avec eux? Par exemple, les supprimer? – erickson

+0

ERRR, s'il y a une clé étrangère, comment peut-elle ne pas correspondre? Avez-vous des codes FK codés en dur dans votre SQL? –

+0

Il signifie une table avec des champs qui sont traités par l'application comme une clé étrangère, mais qui n'ont jamais été appliqués par la base de données elle-même. – BradC

Répondre

8

Voici une façon:

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

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

4

L'autre approche commune est une gauche jointure externe:

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, de parcourir et de voir les valeurs correspondantes (si elles existent), et voir quels ceux qui n'ont pas de correspondance.

0

Il n'y avait pas de contraintes FK dans les tables pour commencer. Les ont été utilisés comme FK et PK mais pas codés - la croyance était qu'ils étaient des frais généraux inutiles. Nous avons donc toutes les colonnes, mais pas de contraintes codées. Quand je suis allé les mettre afin qu'ils soient appliqués, j'ai découvert qu'il y avait beaucoup de violations.

Votre question met en évidence le problème. Ils ne sont pas des frais généraux inutiles, ils empêchent les gens de l'asshattery base de données générale.

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

+0

C'est une idée fausse commune je pense. Beaucoup de gens pensent que cela devrait être fait au niveau intermédiaire pour la logique métier. Mais le FK est une partie fondamentale de toute base de données relationnelle. Si la base de données ne peut pas le faire correctement, il y a d'autres problèmes ... –