2

SQL Server 2008 R2 (バージョン 10.50.4000.0) を使用する場合:

私は2つのテーブルを持っています。IDが別のテーブルに存在するあるテーブルのデータを削除したい。十分に単純です。ただし、入力ミスにより、パーサーのバグと思われるものが見つかりました。

以下のスクリプトでは、[SomeID] は Table1 の列ですが、実際には Table2 には存在しません。

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2)

サブクエリを実行する"Select [SomeID] from Table2と、列が存在しないことを示す適切なエラー メッセージが表示されます。

ただし、削除クエリ全体を実行すると、エラーなしで実行され、table1 内のすべてが削除されます

パーサーは、列がテーブル 2 に存在しないことを認識したはずです。サブクエリの外側から列を使用できることはわかっています。パーサーは、テーブル 1 の列を使用するつもりであると想定していたことに気付きましたが、 table2 の列を指定していなかったので、私の意見では、パーサーは何か問題があることを知るのに十分賢かったはずです。幸いなことに、これが発生したとき、私たちはテスト環境にいました。:)

ありがとう、トニー

4

1 に答える 1

0

エラーではありません。エンジンは、クエリに入力した内容を実行します。

句を使用するInと、各行、フィールド SomeId が比較され、その結果がIn

たとえば、これを行うことができます

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2 where IdTable2 = SomeId)

そのため、定数として、table2 の Id、両方の合計、またはこの場合のように最初のテーブルの ID として、select で何でも返すことができます。

この場合、サブクエリを実行すると、where 句がないため、サブクエリは常に結果を返します (行がない場合を除く)。これはフィルターがないためですが、何が表示されますか? 親クエリでフィールドを指定していて、それを表示できるので、それを返します。もちろん、Inと比較しているように、table1のすべてを削除していますよね?

于 2012-09-06T17:22:32.583 に答える