派生表依赖项



当您将一个表与派生表联接时,派生表查询是否可以引用联接中另一个表的列,为什么?

示例:

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.IDB.ID。因此,如果你要做以下操作,它会起作用:

SELECT *
FROM TableA A
CROSS JOIN (SELECT *
FROM TableB sq
WHERE ID = ID) B;

这是因为WHERE可能是WHERE B.ID = B.ID,而B.ID总是等于其自身的值,除非它具有值NULL

因此,始终量化列非常重要。

最新更新