sql - 相关子查询出错。 "MultiPart ID oh.SalesOrderID could not be bound"

标签 sql sql-server database sql-server-2008 sql-server-2012

今天我和一些同事讨论了这个问题,我们无法就这行不通的原因提出有力的论据,我们只知道行不通。

有人能给我一个可靠的解释吗?

这是查询:

select oh.*,
        test.*
 from Sales.SalesOrderHeader as oh, ( 
                                          select *
                                          from Sales.SalesOrderDetail as od
                                          where oh.SalesOrderID = od.SalesOrderID
                                      ) as test;

非常感谢。

最佳答案

首先,您不能使用 JOIN 语法将相关子查询放在 FROM 子句中。

其次,当您使用 , 时,它会影响别名的范围。

您可能打算:

select oh.*, test.*
from Sales.SalesOrderHeader oh cross apply
     (select *
      from Sales.SalesOrderDetail od
      where oh.SalesOrderID = od.SalesOrderID
     ) test;

您也可以很容易地将其表述为 join:

select oh.*, od.*
from Sales.SalesOrderHeader oh join
     Sales.SalesOrderDetail od
     on oh.SalesOrderID = od.SalesOrderID;

这是将逻辑编写为 SQL 查询的最自然方式。

您的语法让人想起横向连接的 Postgres 语法(apply 所做的)。在 Postgres 中,这将是:

select oh.*, test.*
from Sales.SalesOrderHeader oh, lateral
     (select *
      from Sales.SalesOrderDetail od
      where oh.SalesOrderID = od.SalesOrderID
     ) test;

关于sql - 相关子查询出错。 "MultiPart ID oh.SalesOrderID could not be bound",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057134/

相关文章:

php - sql查询需要很长时间才能完成

sql - 在触发器执行之前数据库关闭会发生什么?

mysql - 为字段指定限定表名的替代解决方案

c# - 安装 SQL Server 2014 Express 包作为 ClickOnce 先决条件

SQL 练习 - 似乎无法解决这个问题

java - 通过 Java 获取创建和填充的 MSSQL 临时表的结果集

mysql - SQL "Not Like ' % %'"条件插入/更新

database - 如何创建不映射到数据库表的 Django 模型

java - 具有多个条目的属性的数据库表设计(例如 : Person -> Social Media)

java - 用于检索特定行的嵌套循环不起作用