サブクエリで使用する列名の修飾
次の例で、外側のクエリの WHERE 句内の CustomerID 列は、外側のクエリの FROM 句内のテーブル名 Sales.Store で暗黙的に修飾されています。サブクエリの選択リスト内の CustomerID への参照は、サブクエリの FROM 句、つまり Sales.Customer テーブルで修飾されています。
USE AdventureWorks;
GO
SELECT Name
FROM Sales.Store
WHERE CustomerID NOT IN
(SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID = 5)
一般的な規則としては、ステートメント内の列名は、同じレベルの FROM 句で参照しているテーブルで暗黙的に修飾されます。サブクエリの FROM 句で参照しているテーブルに列名が存在しない場合、外側のクエリの FROM 句で参照しているテーブルで暗黙的に修飾されます。
これらの暗黙的な修飾関係を明示的に指定すると、クエリは次のようになります。
USE AdventureWorks;
GO
SELECT Name
FROM Sales.Store
WHERE Sales.Store.CustomerID NOT IN
(SELECT Sales.Customer.CustomerID
FROM Sales.Customer
WHERE TerritoryID = 5)
テーブル名を明示的に記述しても間違いであるということはありません。明示的に修飾することで、テーブル名に関する暗黙的な修飾関係をいつでも無効にすることができます。
注意 |
---|
サブクエリで参照している列が、サブクエリの FROM 句で参照しているテーブルにない場合でも、外側のクエリの FROM 句で参照しているテーブルに存在すれば、エラーが発生することなくクエリが実行されます。サブクエリで参照している列は、SQL Server により、外側のクエリのテーブル名で暗黙的に修飾されます。 |