2016-12-18 8 views
3

私はDocumentと呼ばれるテーブルを持っています。テーブル内の他のテーブルに参照のないレコードをすべて削除する

ドキュメント:次に

id int 
docuid int 
doc blob 

I持っている2つの参照テーブル

AppRequiredDocuments

id int 
appid int 
docid int -> references document -> id 

AppDocuments

id int 
appid int 
docid int -> references document -> id 

非常に古い移行孤立したアイテムがドキュメントテーブルにあり、他のテーブルで参照する必要があります。 AppDocumentsまたはAppRequriedDocumentsで参照されていない文書テーブル内の文書のみを削除するにはどうすればよいですか?

答えて

1

あなたはそれらの項目を検索し、削除するためにNOT EXISTSを使用することができます。

delete from document d 
where not exists (select 1 from AppRequiredDocuments a where a.docid = d.id); 
and not exists (select 1 from AppDocuments a where a.docid = d.id); 
+1

。 – STORM

+0

エイリアスを忘れました。今すぐお試しください – GurV

4

一つのアプローチは、結合を削除を使用しています。

DELETE d 
FROM Document d 
LEFT JOIN AppRequiredDocuments t1 
    ON d.id = t1.docid 
LEFT JOIN AppDocuments t2 
    ON d.id = t2.docid 
WHERE t1.docid IS NULL AND 
     t2.docid IS NULL 

ここでロジックが与えられたDocumentレコードがで参照されていない場合ということです何かの2つの補助テーブルでは、結合の結果セットでは、他の2つのテーブルのdocidカラムはとなりますNULLとなります。

+0

関連するテーブルに**存在しない**行を取得するには、 'LEFT OUTER JOIN'が必要になるかもしれません....' INNER JOIN';それらの行は結果セット内にあることさえありません..... –

+1

@marc_s正しいです、私はクエリを更新しました。 –

3

あなたは[not] exists演算子で、例えば、参照の単一の列を生成するunion [all]演算子を使用し、それに対してチェックできます:「D」の近くに不正な構文:私はエラーを取得する

DELETE FROM Document d 
WHERE NOT EXISTS (SELECT * 
        FROM AppRequiredDocuments ard 
        WHERE ard.docid = d.id 
        UNION ALL 
        SELECT * 
        FROM AppDocuments ad 
        WHERE ad.docid = d.id) 
関連する問題