当我尝试使用左连接
进行子查询时,出现错误,这是一个示例。
Select * FROM ( SELECT Code,Column2 FROM T1) TSubQuery, Table2 T2
Left join Table3 T3
On T3.Code = TSubQuery.Code -- <== Error triggered
Where TSubQuery.Code= T2.Code
此代码将触发以下错误:
Msg 4104, Level 16, State 1, Line 3 The multi-part identifier "TSubQuery.Code" could not be bound.
所以我通过将 Where
更改为 Inner join
子句解决了这个问题。
Select * FROM ( SELECT Code,Column2 FROM T1) TSubQuery
Left join Table3 T3
On T3.Code = TSubQuery.Code
Inner join Table2 T2
On T2.Code = TSubQuery.Code
我想了解一下,为什么会出现此错误?
还有另一种方法可以解决这个问题,而不使用内部联接
或使用with子句
吗?
为什么我在使用普通表格或使用 with table
时不会出现此问题?
示例:
With TQuery as ( SELECT * FROM T1)
select * from TQuery, Table2 T2
Left join Table3 T3
On T3.Code = TQuery.Code
Where TQuery.Code = T2.Code
最佳答案
首先,正如我在之前的评论中所说,不要使用 Old-Style joins 。 导致错误的原因是您在两个表中具有相同的列名(在您的情况下为代码列),并且 SQL Server 也不知道您引用的是哪一个,就像您对我说“Esperadoce”而我说哪个“你指的是Esperadoce?。
解决方案是什么?
解决方案是使用别名
作为:
SELECT T1.Code AS T1Code, T2.Code AS T2Code From ...
此外,您还有一个具有旧式和现代式连接的混合查询
,因此解决方案是:
使用带有
别名
的列名称,而不是SELECT *
。使用现代样式连接而不是旧样式,并且不要混合它们。
关于sql-server - 无法使用子查询在 Left join 之后创建 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47790187/