我想用一段SQL来实现组的合并,数据如下,要求如果有成员在两个组则将两个组进行合并

img
源 目标
组号 成员 组号 成员
1061 C1 1061 C1
1061 C2 1061 C2
1061 C3 1061 C3
1062 C1 1061 C1
1062 C4 1061 C4
1062 C3 1061 C3
1063 C1 1061 C1
1063 C3 1061 C3
1064 C4 1061 C4
1064 C5 1061 C5
1065 C5 1061 C5
1065 C6 1061 C6
2001 C7 2001 C7
2001 C8 2001 C8
2001 C9 2001 C9
2002 C10 2001 C10
2002 C9 2001 C9
3001 C11 3001 C11
3001 C12 3001 C12

你的这个问题有点看不懂,可不可以理解为找出每个成员所在的组?还有你的原数据和目标数据怎么都是一样的?

select t.num as '成员',GROUP_CONCAT(t.gp )  as '所在组' from t_group_number  t  group by t.num 
/*以下是运行结果,不知道是不是你想要的*/
成员    所在组
C1    1061,1062,1063
C10    2002
C11    3001
C12    3001
C2    1061
C3    1062,1063,1061
C4    1064,1062
C5    1064,1065
C6    1065
C7    2001
C8    2001
C9    2001,2002

你这个有点类似于遗传病分析,也就是树形扩展,一个sql很难搞定,需要写过程。

把2个表的数据写入到2个字段相同的表,然后 union 一下就自动合并了

create table #a(zh int,cy varchar(10),newzh varchar(10))

insert into #a (zh,cy,newzh) values(1061,'C1','')
insert into #a (zh,cy,newzh) values(1061,'C2','')
insert into #a (zh,cy,newzh) values(1061,'C3','')
insert into #a (zh,cy,newzh) values(1062,'C1','')
insert into #a (zh,cy,newzh) values(1062,'C4','')
insert into #a (zh,cy,newzh) values(1062,'C3','')
insert into #a (zh,cy,newzh) values(1063,'C1','')
insert into #a (zh,cy,newzh) values(1063,'C3','')
insert into #a (zh,cy,newzh) values(1064,'C4','')
insert into #a (zh,cy,newzh) values(1064,'C5','')
insert into #a (zh,cy,newzh) values(1065,'C5','')
insert into #a (zh,cy,newzh) values(1065,'C6','')
insert into #a (zh,cy,newzh) values(2001,'C7','')
insert into #a (zh,cy,newzh) values(2001,'C8','')
insert into #a (zh,cy,newzh) values(2001,'C9','')
insert into #a (zh,cy,newzh) values(2002,'C10','')
insert into #a (zh,cy,newzh) values(2002,'C9','')
insert into #a (zh,cy,newzh) values(3001,'C11','')
insert into #a (zh,cy,newzh) values(3001,'C12','')

SELECT cy,min(zh) as minzh
into #b
from #a
group by cy
having count(zh)>=2

--循环
DECLARE @minzh INT,@cy varchar(10)
DECLARE cursor_a CURSOR FOR
SELECT minzh,cy FROM #b
OPEN cursor_a
FETCH NEXT FROM cursor_a INTO @minzh,@cy
WHILE @@FETCH_STATUS=0
BEGIN
update #a set newzh=@minzh where zh in (select zh from #a where cy=@cy) and newzh=''

FETCH NEXT FROM cursor_a INTO @minzh,@cy
END
CLOSE cursor_a
DEALLOCATE cursor_a;

--循环完成后如果 newzh 还为空,则取原 zh 填充
update #a set newzh=zh where newzh=''
--查看结果
select * from #a