【问题标题】:Error on Correlated Sub Query. "MultiPart ID oh.SalesOrderID could not be bound"相关子查询出错。 “MultiPart ID oh.SalesOrderID 无法绑定”
【发布时间】:2017-03-27 21:55:31
【问题描述】:

今天我和一些同事讨论了这个问题,我们无法确定为什么这不起作用,我们只知道它不起作用。

谁能给我一个可靠的解释?

这是查询:

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

非常感谢。

【问题讨论】:

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


【解决方案1】:

首先,您不能使用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;

【讨论】:

  • 谢谢。两个问题。你能就这两个主题给出两个技术答案吗? 1) 为什么技术上 SQL Server 不允许我这样做“首先,您不能使用 JOIN 语法将相关子查询放在 FROM 子句中。”; 2)它如何影响? “其次,当你使用 , 时,它会影响别名的范围。”非常感谢您的帮助。
  • @Tito 。 . . SQL Server 不允许这样做,因为它从来都不是 SQL 语言的一部分。绝不。 , 对字段进行“分组”,cross join 也是如此。您不能在第二部分的 on 子句中引用第一个表。但是,由于您永远不应该在 from 子句中使用逗号(好吧,可以在 Postgres 中横向连接或在 MS Access 中使用 cross join),这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多