作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们有两个表
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/
我是一名优秀的程序员,十分优秀!