You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:17:49