次のようなクエリがあります。
select * from T1 where abc in (select distinct abc from T2);
シナリオは、テーブル T2 に abc という名前のフィールドがないため、内部クエリは無効になりますが、それでもクエリ全体が出力を返します。
この動作の理由は何ですか?
に列がない場合、サブクエリabc
内のt2
への参照は、内の列をabc
探すことによって解決されます。したがって、クエリは最終的にabc
t1
select *
from T1
where t1.abc in (select distinct t1.abc
from T2);
T2
これは常に真です (少なくとも 1 つの行t1.abc
があり、NULL ではないことを前提としています。
これは、列参照を常に修飾する必要がある多くの理由の 1 つです。そうすれば、別のテーブルへの予期しない参照を取得するのではなく、構文エラーを取得できます。
T1 の abc はサブクエリから参照でき、テーブル T2 の任意の式にリストできます。
したがって、T2 の各行に対して、T1 の現在の行の abc の値が返されます。
個別であるため、副選択は 1 行だけを返します。
したがって、'abc in (abc)' は常に true であり、効果的に書いたことになります。
select * from T1;