0

私は次のクエリを持っています

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT  Column1 FROM Table2)

実際には、Table2にはColumn1という名前の列はありません。したがって、サブクエリのみを実行すると

 SELECT  Column1 FROM Table2

エラーがスローされます-無効な列名'Column1'。

しかし、完全なクエリを実行しても、エラーは発生しません。表1の合計行数を取得しています。

したがって、このクエリでエラーが発生しない理由と、このシナリオでのIN句の動作方法を知りたいと思います。

4

2 に答える 2

2

サブクエリ内では、外部クエリから列にアクセスできます。そして、それがここで起こっていることです:

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT  Column1 FROM Table2)

次のように書くこともできます:

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT Table1.Column1 FROM Table2)

に少なくとも1つの行があるTable2場合、サブクエリは常にColumn1からの値を返しTable1IN()は成功します。

これが、私が通常エイリアスの使用を推奨する理由の1つです。

SELECT COUNT(*) 
FROM Table1 t1
WHERE t1.Column1 IN
(SELECT t2.Column1 FROM Table2 t2)

にがない場合はエラーが発生しますColumn1-または、サブクエリ内で参照を行うTable2場合は、意図的であることがより明白になります。t1

于 2012-10-10T12:38:08.663 に答える
0

返されるカウントは、Table1notからの結果Table2です。実行プランを見るとLEFT SEMI JOIN、クエリにaが使用されていることがわかります。したがって、列で結合できない場合は、次のクエリが実行されると思います。

SELECT COUNT(*) 
FROM Table1 

これが、クエリが引き続き有効であり、同じ出力を返す理由です。

于 2012-10-10T11:14:25.083 に答える