gpt4 book ai didi

sql - 内连接与交叉应用 - 无法绑定(bind)多部分标识符

转载 作者:行者123 更新时间:2023-12-04 05:13:02 24 4
gpt4 key购买 nike

考虑以下架构:

create table TableA (A1 int)
create table TableB (B1 int, B2 int)
create table TableC (C1 int, C2 int)
create table TableD (D1 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.C2) foo ON foo.C1=a.A1
INNER JOIN TableD d ON d.D1=foo.C1

在 SQL Fiddle (SQL Server 2008) 中,我得到以下结果:
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.C2) foo ON foo.C1=a.A1 INNER JOIN TableD d ON d.D1=foo.C1

但是用 CROSS APPLY 替换子查询的 INNER JOIN 可以解决问题:
SELECT * 
FROM TableA a
INNER JOIN TableB b ON b.B1=a.A1
CROSS APPLY (SELECT TOP 1 *
FROM TableC c
WHERE c.C1=b.B1 AND c.C1=a.A1 ORDER BY c.C2) foo
INNER JOIN TableD d ON d.D1=foo.C1

我的问题是:

1)为什么第一次查询失败?

2)为什么第二个查询没有失败?

3) CROSS APPLY 特定于 SQL Server。哪个是这个问题的 SQL 标准解决方案?

重要提示 : 不要试图去理解 TableA,...,TableD 背后的逻辑。它们只是对更复杂查询的抽象(读起来很糟糕)。我想你会明白这个问题的。

最佳答案

from 中不允许相关子查询条款。这就是为什么 inner join版本不起作用。我其实不知道这件事的来历。一个问题是您可能会在依赖项中获得循环,这虽然不难检测,但会使查询无法处理。

您对 cross apply 的查询是一种情况,cross apply很合适。但是,我不知道它在大数据上的执行情况如何。

这是用标准 SQL 重写它的尝试:

SELECT * 
FROM TableA a
INNER JOIN TableB b ON b.B1=a.A1
INNER JOIN (select *
from (select c.*, row_number() over (partition by c1 order by c2)
FROM TableC c
) c
where seqnum = 1 and foo.C1=a.A1 and c.C1=b.B1
) foo
INNER JOIN TableD d ON d.D1=foo.C1

关于sql - 内连接与交叉应用 - 无法绑定(bind)多部分标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14657226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com