単一のクエリですべての孤立レコードを取得するにはどうすればよいですか?


8

主キーを参照しない孤立したレコード(外部キー)を持つテーブルがいくつかあることに気づきました。テーブルにクエリを実行して、そのようなすべての行のリストを取得するにはどうすればよいですか?これらの親レコードが削除されたとき、またはこれをどのように処理しますか?

私はSQL Server 2008 R2を使用しており、クリーンアップ後に3つの類似したデータベースを1つにインポートしようとしています。アドバイスしてください。

サンプルの子テーブル(DocumentDistribution)と親テーブル(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] 

テーブルが関係にあり、外部キー制約が明示的に定義されていることを教えてくれませんか?

回答:


20

これは、知っているテーブル間にリレーションシップがあり、SQL Serverがそうでない場合にのみ可能です。

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

さて、将来、この関係を明示的に定義すると、子行がまだ存在している間は、親行を削除できなくなります。本日そこにあるべきではない行を削除するには:

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

次に、これらの制約を無効にする権利を取り除き、間違った方法でこれをやめるようにします。


子テーブルと親テーブルを切り替えることにより、反対のアクションを実行することもできます。これにより、子テーブルで参照されていないすべての親行(孤立した親)が削除されます。
djule5 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.