如何合并同一表中ColumnA值相同的行?附代码尝试及数据示例
合并同一ColumnA值的行并整合非空字段
现有名为tbl的数据库表,需合并其中ColumnA值相同的行,将各行非空字段数据整合到同一行中。尝试了以下UPDATE代码但未达到预期效果,求正确实现方法:
-- 用户原代码 UPDATE a.ColumnA FROM tbl a INNER JOIN tbl b ON a.ColumnA = b.ColumnA WHERE a.tbl = b.tbl
合并前的数据表
| ColumnID | ColumnA | ColumnB | ColumnC |
|---|---|---|---|
| 1 | 1 | data1 | |
| 2 | 1 | data2 | |
| 3 | 2 | data3 | |
| 4 | 2 | data4 |
期望合并后的数据表
| ColumnID | ColumnA | ColumnB | ColumnC |
|---|---|---|---|
| n | 1 | data2 | data1 |
| n | 2 | data4 | data3 |
正确实现方法
方法1:生成新的合并结果表(推荐,避免修改原表)
利用聚合函数MAX(或MIN)提取每组ColumnA下的非空值(NULL会被聚合函数忽略),同时可指定新的ID或保留原组内的最小/最大ID:
SELECT MIN(ColumnID) AS ColumnID, -- 保留每组最小ID,也可用NEWID()生成新ID ColumnA, MAX(ColumnB) AS ColumnB, MAX(ColumnC) AS ColumnC FROM tbl GROUP BY ColumnA;
方法2:更新原表并删除重复行
如果需要直接修改原表,分两步操作:
- 填充非空字段:将同一
ColumnA组内的非空值合并到保留行中(这里选择每组ID最小的行作为保留行)
UPDATE a SET ColumnB = COALESCE(a.ColumnB, b.ColumnB), ColumnC = COALESCE(a.ColumnC, b.ColumnC) FROM tbl a JOIN tbl b ON a.ColumnA = b.ColumnA AND a.ColumnID < b.ColumnID;
- 删除重复行:移除每组中除保留行外的其他行
DELETE FROM tbl WHERE ColumnID NOT IN ( SELECT MIN(ColumnID) FROM tbl GROUP BY ColumnA );
原代码问题说明
- 语法错误:
UPDATE a.ColumnA写法错误,UPDATE语句应指定要更新的表,而非单个字段 - 无效条件:
WHERE a.tbl = b.tbl无实际意义,因为操作的是同一个表,无需此判断
内容的提问来源于stack exchange,提问作者SpawnRivera
相关产品推荐
相关产品推荐

