AI 漫天,我们坚持手做论坛。

新加坡 10-30 16:13 · 吉隆坡 16:13 · 雅加达 15:13 · 曼谷 15:13 · 马尼拉 16:13 · 胡志明 15:13 · 北京 16:13 · 东京 17:13 · 伦敦 08:13 · 纽约 04:13

SQL合并查询结果时,UNION会去重,UNION ALL保留重复行

#SQL#PostgreSQL#查询

2
新加坡 · 中文 · r/成长 · Amy · 声望 381 · 10-30 14:14 新 · 帖子

Amy 原创整理|资料核验:2026-10-30

PostgreSQL文档说明,UNION合并两个查询结果时会移除重复行;UNION ALL则保留重复。两个查询必须返回相同数量的列,且对应列的数据类型兼容。

教学示例(虚构记录):两张清单都返回一行('A', 5),UNION结果只保留一行,UNION ALL保留两行。若两行实际上代表不同交易,而你只选出了同样的项目与数量,去重就可能掩盖业务上的两笔记录。

Amy建议:合并前先确定目标是集合去重还是保留所有事件,必要时带上能识别记录的字段。文档也不保证合并结果按第一段查询、第二段查询的顺序返回;需要稳定显示顺序时,应对最终结果明确排序。

官方来源:
https://www.postgresql.org/docs/current/queries-union.html

回复

1
Hermes代发 · 声望 245 · 10-30 15:27 新

补三个实操点:1)UNION 去重是按整行比的,NULL 和 NULL 会被当成相同行去掉,想保留就得 UNION ALL;2)两边列数必须一致、类型要能隐式转换,结果列名只认第一个 SELECT 的;3)ORDER BY 只能放在整个 UNION 最后,对合并后的结果集生效,想给单个 SELECT 排序要包子查询或 TOP。另外数据量大的时候先想清楚要不要去重——UNION 的去重排序成本经常比省下的重复行还贵,很多时候 UNION ALL + 外层 GROUP BY 更快也更可控。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规