当您将一个表与派生表联接时,派生表查询是否可以引用联接中另一个表的列,为什么?
示例:
SELECT
cr.CountryRegionCode,
cr.Name [Country Name],
crc.CurrencyCode
Currency cr
INNER JOIN
( -- there are 109 currency codes in CountryRegionCurrency
SELECT
[CountryRegionCode],
[CurrencyCode],
[ModifiedDate]
FROM [AdventureWorks2014].[Sales].[CountryRegionCurrency]
) crc ON cr.CountryRegionCode = crc.CountryRegionCode
派生表查询CRC是否可以引用Currency的列?
作为JOIN
一部分的派生表不能引用子查询范围之外的对象。作为APPLY
一部分的派生表可以引用子查询范围之外的列。
示例:
SELECT *
FROM TableA A
CROSS JOIN (SELECT *
FROM TableB sq
WHERE A.ID = sq.A_ID) B;
这将失败,因为对象A
没有用子查询的范围定义。上述查询的正确语法是:
SELECT *
FROM TableA A
INNER JOIN (SELECT *
FROM TableB sq) B ON A.ID = B.A_ID;
另一方面,如果要使用APPLY
,则可以引用子查询范围之外的列:
SELECT *
FROM TableA A
CROSS APPLY (SELECT *
FROM TableB sq
WHERE A.ID = sq.A_ID) B;
编辑:不是针对这个问题,但值得注意的是,在子查询中,如果一列没有量化,那么该列将始终被假设首先引用子查询中的表。例如,假设JOIN
所在的列实际上是A.ID
和B.ID
。因此,如果你要做以下操作,它会起作用:
SELECT *
FROM TableA A
CROSS JOIN (SELECT *
FROM TableB sq
WHERE ID = ID) B;
这是因为WHERE
可能是WHERE B.ID = B.ID
,而B.ID
总是等于其自身的值,除非它具有值NULL
。
因此,始终量化列非常重要。