编写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
相关产品推荐
相关产品推荐

