Wie kann ich alle verwaisten Datensätze in einer einzigen Abfrage abrufen?

8

Ich habe nur wenige Tabellen mit verwaisten Datensätzen (Fremdschlüsseln) bemerkt, die nicht mehr auf einen Primärschlüssel verweisen. Wie kann ich die Tabellen abfragen, um eine Liste aller dieser Zeilen zu erhalten? Wann wurden diese übergeordneten Datensätze gelöscht oder wie wird damit umgegangen?

Ich verwende SQL Server 2008 R2 und wir versuchen, 3 ähnliche Datenbanken nach dem Bereinigen in eine zu importieren.

Skript einer untergeordneten Beispieltabelle (DocumentDistribution) und einer übergeordneten Tabelle (DocumentSource):

ALTER TABLE [dbo].[DocumentDistribution] WITH NOCHECK ADD CONSTRAINT [fk_documentdistsourceid_documentsourceid] FOREIGN KEY([DocumentDistSourceID]) REFERENCES [dbo].[DocumentSource] ([DocumentSourceID]) 
GO
 ALTER TABLE [dbo].[DocumentDistribution] CHECK CONSTRAINT [fk_documentdistsourceid_documentsourceid] 

Sagt mir das nicht, dass die Tabellen in Beziehungen stehen und die Fremdschlüsseleinschränkungen explizit definiert haben?

Shayma Ahmad
quelle

Antworten:

20

Dies sollte nur möglich sein, wenn Sie eine Beziehung zwischen Tabellen haben, die Sie kennen, SQL Server jedoch nicht.

SELECT fk 
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Definieren Sie diese Beziehung jetzt in Zukunft explizit. Dann können die übergeordneten Zeilen nicht mehr gelöscht werden, solange noch untergeordnete Zeilen vorhanden sind. So löschen Sie die Zeilen, die heute nicht vorhanden sein sollten:

DELETE c
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Nehmen Sie als Nächstes ihre Rechte zum Deaktivieren dieser Einschränkungen weg, damit sie dies nicht mehr falsch machen.

Aaron Bertrand
quelle
Sie können auch die umgekehrte Aktion ausführen, indem Sie die untergeordneten und übergeordneten Tabellen wechseln. Dies würde alle übergeordneten Zeilen löschen, auf die in der untergeordneten Tabelle nicht verwiesen wird - verwaiste Eltern, wenn Sie so wollen.
djule5