SQL中如何对三个UNION结果按ID分组并保留所有字段?
解决方法:将UNION结果按ID聚集展示
没问题,我来帮你理清这个需求的实现方式!首先得明确一点:你说的“按ID分组使相同ID聚集”,如果只是想让相同ID的所有行挨在一起展示,其实用ORDER BY就可以了——GROUP BY是用来做数据聚合(比如计数、求和)的,不是单纯用来归拢行的,别搞混啦~
基础实现(仅归拢相同ID的行)
先把你的三个UNION查询包裹成一个子查询(必须给子查询起别名,不然数据库会报错),然后外层用SELECT *获取所有列,最后用ORDER BY id排序就行:
SELECT * FROM ( -- 第一个数据源查询 SELECT id, category, other_columns FROM your_first_table UNION ALL -- 如果你需要去重就用UNION,保留重复行用UNION ALL(性能更好) -- 第二个数据源查询 SELECT id, category, other_columns FROM your_second_table UNION ALL -- 第三个数据源查询 SELECT id, category, other_columns FROM your_third_table ) AS combined_data ORDER BY id;
这样运行后,结果里的ID就会是你想要的001、001、034、034这种聚集状态啦。
如果你确实需要聚合数据(用GROUP BY)
要是你不仅想归拢行,还需要对每个ID的行做统计(比如计数、取最大值),那才需要用到GROUP BY。举个例子,比如统计每个ID的行数,同时保留类别信息:
SELECT id, category, COUNT(*) AS total_rows -- 聚合函数:统计每个ID的行数 FROM ( SELECT id, category, other_columns FROM your_first_table UNION ALL SELECT id, category, other_columns FROM your_second_table UNION ALL SELECT id, category, other_columns FROM your_third_table ) AS combined_data GROUP BY id, category; -- 注意:标准SQL要求GROUP BY包含所有非聚合列,不同数据库可能有差异
关键提醒
- 子查询必须起别名(比如上面的
combined_data),这是SQL的语法要求,不然会报错 UNION会自动去重,但性能比UNION ALL差;如果你的三个数据源本身没有重复行,或者你不需要去重,优先用UNION ALL
内容的提问来源于stack exchange,提问作者noimdirtydunn
相关产品推荐
相关产品推荐

