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

Oracle如何将符合sub_id筛选条件的多行数据合并为单行

行转列高效实现方案

比自连接更简洁、性能更好的实现方式是条件聚合,该方案仅需对原表做一次扫描即可得到结果,筛选的Sub Id数量越多,相比自连接的性能优势越明显。

示例代码

假设你的业务表名为biz_record,要筛选Sub Id为20、30、50的数值,SQL写法如下:

SELECT
    Id,
    MAX(CASE WHEN `Sub Id` = 20 THEN Value END) AS Sub_Id_20_value,
    MAX(CASE WHEN `Sub Id` = 30 THEN Value END) AS Sub_Id_30_value,
    MAX(CASE WHEN `Sub Id` = 50 THEN Value END) AS Sub_Id_50_value
FROM biz_record
WHERE `Sub Id` IN (20, 30, 50)
GROUP BY Id;

方案说明

  • 核心逻辑:通过CASE WHEN把对应Sub Id的Value提取出来,再通过聚合函数把同Id下的多个行合并为单行。因为同一个Id和Sub Id的组合理论上仅对应一条Value,使用MAX/MIN/SUM都可以拿到正确结果,其中MAX兼容性最好,适配数值、字符串等所有可比较的字段类型。
  • 性能表现:语句先通过WHERE条件过滤掉不需要的Sub Id数据,再做单次扫描聚合,时间复杂度为O(n);而自连接方案每增加一个要展示的Sub Id就需要多关联一次原表,数据量较大时性能差距会非常显著。
  • 扩展成本:后续如果需要新增展示其他Sub Id的Value,只需要在SELECT子句中新增一段对应的CASE WHEN聚合逻辑,同时在WHERE的IN列表中补充对应的Sub Id即可,不需要调整复杂的表关联结构。

如果你使用的是MySQL数据库,也可以用IF()函数简化CASE WHEN的写法,例如MAX(IF(Sub Id = 20, Value, NULL)) AS Sub_Id_20_value,执行效果和CASE WHEN完全一致。


内容的提问来源于stack exchange,提问作者Mudit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:03:54