Come posso ottenere tutti i record orfani in una singola query?


8

Ho appena notato alcune tabelle con record orfani (chiavi esterne) che non indicano più alcuna chiave primaria. Come posso interrogare le tabelle per ottenere un elenco di tutte queste righe? Quando questi record padre sono stati eliminati o come gestirlo?

Sto usando SQL Server 2008 R2 e stiamo cercando di importare 3 database simili in uno dopo averlo ripulito, per favore avvisa.

Scritto una tabella figlio di esempio (DocumentDistribution) e una tabella padre (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] 

Questo non mi dice che le tabelle sono nelle relazioni e hanno esplicitamente definito i vincoli di chiave esterna?

Risposte:


20

Questo dovrebbe essere possibile solo se si ha una relazione tra tabelle di cui si è a conoscenza ma SQL Server no.

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

Ora, in futuro, definisci esplicitamente questa relazione, quindi le persone non saranno in grado di eliminare le righe principali mentre esistono ancora righe secondarie. Per eliminare le righe che non dovrebbero essere presenti oggi:

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

Successivamente, togli i loro diritti per disabilitare questi vincoli in modo che smettano di farlo nel modo sbagliato.


Puoi anche fare l'azione opposta cambiando le tabelle figlio e padre. Ciò eliminerebbe tutte le righe principali a cui non fa riferimento la tabella figlio - genitori orfani, se lo desideri.
djule5,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.