2011-11-09 9 views
1

私は2つのテーブルFinalListRemoveTheseIDsListを持っています。どちらも同じプライマリキーIDを持っています。 FinalListからRemoveTheseIDsListにあるすべての行を削除したいとします。そのクエリがFinalListからすべての単一の行を削除している必要があり、理論的にはSQL Server:このDeleteクエリはなぜ機能しないのですか?

Delete from FinalList 
    Where FinalList.ID not in (Select ID from RemoveTheseIDsList) 

:だから、私はこの最初のクエリを書きました。代わりに、それは私が最終的に(仕事をする)この不格好な回避策に落ち着い0を削除:

Update FinalList set DeleteMe='Y' 
    from FinalList FLL 
    left join RemoveTheseIDsList REM on FLL.ID=REM.ID 
    where REM.ID is null 
Delete from FinalList where DeleteMe='Y' 

私の質問は:なぜ、最初のクエリは動作しませんでしたか?このクエリーを機能的にも小規模にも保つクイックフィックスはありますか?

+0

あなたは**正** ** IDは実際には、「RemoveTheseIDsList」の主キーですか?私はそれがnullableであり、少なくとも1つの 'NULL'を含んでいると疑うか、' RemoveTheseIDsList'に 'ID'という列が全くなく、サブクエリが外側のクエリから' ID'カラムを参照しています。 –

+2

どのようなエラーがありましたか?その最初のクエリは 'ID NOT IN()'ではなく 'ID IN()'を読み込むべきですか? –

+0

@MichaelHaren - 左外部結合問合せはアンチ・セミ結合を行っていますが、記述にもかかわらず 'NOT IN'セマンティクスが必要であると推測します。 –

答えて

4

あなたが言うように:だからそれがあるべき

「私は RemoveTheseIDsListであるFinalList からすべてのレコードを削除する」:

Delete from FinalList 
Where FinalList.ID IN (Select ID from RemoveTheseIDsList) 

しかし、あなたの更新がそうでないかもしれないではそうのようなものですこれを試してください:

Delete from FinalList 
Where FinalList.ID NOT IN (Select RemoveTheseIDsList.ID from RemoveTheseIDsList) 
+1

は、結合として書き直すことができ、あなたが 'FinalListのFL FROM FL をDELETE INNER JOINをRemoveTheseIDsList RTL ON fl.ID = rtl.ID' – Toby

+0

は私が'とRemoveTheseIDsList.IDが追加されていないと思い好む何依存NULL'それが私の主な疑念であることを確かめるために、 'NOT IN'サブクエリーに入れます。 –

+0

彼がnull値を持っている場合finalListで彼が更新を行う場合、私は左の結合のすべての行がnullになると思います。それはRemoveTheseIDsListテーブルのすべてのレコードを削除する理由です。だから私の答えの最初の削除が正しいはずです。 – GregM

関連する問題