sql-server - 无法使用子查询在 Left join 之后创建 where 子句

标签 sql-server tsql join sql-server-2016

当我尝试使用左连接进行子查询时,出现错误,这是一个示例。

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/

相关文章:

java - Criteria Builder JOIN 未引用的表

sql - 内部联接与自然联接与 USING 子句 : are there any advantages?

sql-server - 使用sql中的日期函数获取天/月/年之前的过去日期

sql - 计算条件适用于两列的连续天数

类似于 MySql REGEX 函数的 SQL Regex 函数

SQL:何时以及为什么允许两个 on 条件?

mysql - 索引在mysql中对性能的作用

sql-server - TSQL 将 newid 转换为十进制(38,0)

sql-server - SQL Server部分数据库备份(不包括部分表)

sql - 从 SQL Server 2012 中具有几何数据的表中将坐标划分为 X 和 Y 坐标