SQL Server 2008 Management Studio の構文チェック動作
SQL Server 2008 Management Studio で、無効な列参照を含むクエリを実行すると、予期しない動作が観察されました。クエリは次のとおりです:
<code class="language-sql">delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142)</code>
「hs_id」は「HotelSupplier」テーブルの有効な列名ではありませんが (正しい列名は「hs_key」です)、クエリは正常に実行され、「Photo」テーブルのすべての行が削除されます。ここで疑問が生じます: 構文の問題が原因でクエリが失敗するはずはありませんか?
その答えは、相関サブクエリの概念にあります。 「DELETE」ステートメントはサブクエリに関連付けられています。これは、サブクエリ内の「hs_id」参照が外側のクエリ (「Photo」) の「hs_id」列に解決されることを意味します。
これは有効な動作であり、テーブル名を明示的に指定せずにクエリで親テーブルの列を参照できるようになります。この場合、結果は次と同等になります:
<code class="language-sql">delete from Photo where Photo.hs_id in (select Photo.hs_id from HotelSupplier where id = 142)</code>
サブクエリ自体が列を明示的に射影していない場合でも、外側のクエリのパターンはサブクエリに伝播されます。
したがって、このような「構文に準拠していない」クエリが成功し、サブクエリ内の修飾されていない列参照を外部クエリに関連付けることは、SQL Server の通常の動作であると考えられます。
以上がSQL Server 2008 Management Studio では、相関サブクエリ内の無効な列参照を含む削除クエリが正常に実行できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。