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

编写SQL查询:按type拆分列并关联group_id,保留所有行

React表格展示的SQL查询解决方案

问题症结

你之前的查询只返回有匹配group_id的行,核心原因是用了INNER JOIN——这种连接方式会过滤掉所有未在两张表中匹配到的记录。要保留无group_id的条目,必须改用LEFT JOIN,再结合条件聚合实现行转列与合并。

最终SQL写法

假设表1名为task_groups,表2名为task_attributes,以下语句完全适配需求:

SELECT
    -- 无group_id时返回"无分组",无需自定义可直接写tg.group_id返回NULL
    COALESCE(tg.group_id, '无分组') AS group_id,
    ta.task_id,
    -- 提取type=1的字段,无对应数据时自动返回NULL
    MAX(CASE WHEN ta.type = 1 THEN ta.assigned_id END) AS assigned_id_type1,
    MAX(CASE WHEN ta.type = 1 THEN ta.name END) AS name_type1,
    MAX(CASE WHEN ta.type = 1 THEN ta.value END) AS value_type1,
    -- 提取type=2的字段,需求明确type2无value,固定返回NULL
    MAX(CASE WHEN ta.type = 2 THEN ta.assigned_id END) AS assigned_id_type2,
    MAX(CASE WHEN ta.type = 2 THEN ta.name END) AS name_type2,
    NULL AS value_type2
FROM
    task_attributes ta
-- 用LEFT JOIN保留task_attributes的所有记录,即使无对应group_id
LEFT JOIN task_groups tg 
    ON ta.task_id = tg.task_id
-- 按group_id和task_id分组,实现同一group_id的行合并
GROUP BY COALESCE(tg.group_id, '无分组'), ta.task_id

关键细节说明

  • LEFT JOIN的作用:确保task_attributes中所有条目(包括未匹配到task_groups的)都能被查询到,不会被过滤
  • 条件聚合(CASE + MAX):把不同type的行数据转换为同一行的不同列,MAX用来过滤NULL值,保留有效数据
  • COALESCE处理空group_id:可自定义无分组时的显示文本,若不需要直接保留tg.group_id即可,空字段会返回NULL,适配React表格的空值展示
  • type2的value字段:因需求明确type2无value,直接设为NULL即可,无需额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:22:28