【发布时间】:2013-01-17 08:56:16
【问题描述】:
架构:
create table TableA (A1 int)
create table TableB (B1 int, B2 int)
create table TableC (C1 int)
有问题的查询:
SELECT *
FROM TableA a
INNER JOIN TableB b ON b.B1=a.A1
INNER JOIN (SELECT TOP 1 *
FROM TableC c
WHERE c.C1=b.B1 ORDER BY c.C1) d ON d.C2=b.B2
INNER JOIN OtherTable ON OtherTable.Foo=d.C1
构建此架构并在 SQL Server 2008 下的 SQLFiddle 中运行查询会导致:
The multi-part identifier "b.B1" could not be bound.: SELECT * FROM TableA a INNER JOIN TableB b ON b.B1=a.A1 INNER JOIN (SELECT TOP 1 * FROM TableC c WHERE c.C1=b.B1 ORDER BY c.C1) d ON d.C2=b.B2
对子查询使用 CROSS APPLY 而不是 INNER JOIN 可以解决问题
有什么问题?
编辑:我添加了“TOP 1”,它是真实查询的一部分,它是问题的相关部分。
Edit2:有关问题的更多信息。
【问题讨论】:
-
好的。查看您的子查询。您按 C1 过滤,然后按 C1 排序。什么意思?我想你一定要
ORDER BYC2。 -
这是对真实查询的抽象
-
但是你扭曲了逻辑。请参阅我的更新答案。
-
使用 CROSS APPLY(或在我的情况下使用 OUTER APPLY 而不是 LEFT JOIN)...为我解决了这个问题!
-
CROSS APPLY对我来说是新的,但解决了我的挑战!感谢您发布此内容。
标签: sql sql-server-2008 join subquery inner-join