今天我和一些同事讨论了这个问题,我们无法就这行不通的原因提出有力的论据,我们只知道行不通。
有人能给我一个可靠的解释吗?
这是查询:
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/