gpt4 book ai didi

sql - 交叉应用中的 GROUP BY

转载 作者:行者123 更新时间:2023-11-29 11:58:00 24 4
gpt4 key购买 nike

让我们有两个表

create table A (
fkb int,
groupby int
);

create table B (
id int,
search int
);

insert into A values (1, 1);
insert into B values (1, 1);
insert into B values (2, 1);

然后是下面的查询

select B.id, t.max_groupby - B.search diff
from B
cross apply (
select max(A.groupby) max_groupby
from A
where A.fkb = B.id
) t

返回预期结果如下

id  diff
---------
1 0
2 NULL

但是,当我将 group by A.fkb 添加到交叉应用中时,相应 A.fkb 所在的 B 行不存在,消失。

select B.id, t.max_groupby - B.search diff
from B
cross apply (
select max(A.groupby) max_groupby
from A
where A.fkb = B.id
group by A.fkb
) t

我在 SQL Server 和 PostgreSQL 上进行了测试(使用 cross join lateral 而不是 cross apply)。为什么 group by 会使该行消失?似乎 cross apply 在第一种情况下表现为外部连接,在后一种情况下表现为内部连接。但是,我不清楚为什么。

最佳答案

单独看内层查询的结果可以看到:

select max(A.groupby) max_groupby
from A
where A.fkb = 2;

返回 max_groupby = null 的单行:

max_groupby
-----------
(null)

然而,由于没有包含 A.fkb = 2 的行,因此分组会产生一个空结果,您可以在运行时看到该结果:

select max(A.groupby) max_groupby
from A
where A.fkb = 2
group by A.fkb

因此交叉连接不会返回 fkb = 2

的返回行

您需要使用外部联接才能包含 B 中的行。

在 Postgres 中你必须这样写:

select B.id, t.max_groupby - B.search diff
from B
left join lateral (
select max(A.groupby) max_groupby
from A
where A.fkb = B.id
group by A.fkb
) t on true

我不知道 SQL Server 中 left join lateral 的等价物是什么。
on true 需要写成 在 1=1.

关于sql - 交叉应用中的 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55627237/

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