相关子查询出错。 “无法绑定”MultiPart ID oh.SalesOrderID“

时间:2017-03-27 21:55:32

标签: 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;

提前多多感谢。

1 个答案:

答案 0 :(得分:4)

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

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

你可能打算:

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;