0

次のようなクエリがあります。

select * from T1 where abc in (select distinct abc from T2);

シナリオは、テーブル T2 に abc という名前のフィールドがないため、内部クエリは無効になりますが、それでもクエリ全体が出力を返します。

この動作の理由は何ですか?

4

2 に答える 2

2

に列がない場合、サブクエリabc内のt2への参照は、内の列をabc探すことによって解決されます。したがって、クエリは最終的にabct1

select * 
  from T1 
 where t1.abc in (select distinct t1.abc 
                    from T2);

T2これは常に真です (少なくとも 1 つの行t1.abcがあり、NULL ではないことを前提としています。

これは、列参照を常に修飾する必要がある多くの理由の 1 つです。そうすれば、別のテーブルへの予期しない参照を取得するのではなく、構文エラーを取得できます。

于 2012-10-23T09:46:26.990 に答える
0

T1 の abc はサブクエリから参照でき、テーブル T2 の任意の式にリストできます。

したがって、T2 の各行に対して、T1 の現在の行の abc の値が返されます。

個別であるため、副選択は 1 行だけを返します。

したがって、'abc in (abc)' は常に true であり、効果的に書いたことになります。

select * from T1;
于 2012-10-23T09:45:14.043 に答える