如何为SQL中的所有链接值创建公共/父ID?

时间:2016-06-10 15:48:14

标签: sql sql-server

我有以下数据,包含多个帐户之间的所有链接。

Col1    Col2
----------
A   B
A   C
B   C
D   E
F   G
G   H
I   A
J   I 

我想为所有链接帐户创建通用ID。在上面的例子中,A,B,C,I,J被链接。所以他们应该得到相同的ID。

我的最终数据应该与下面的内容类似。

**ID    Parent_ID**
----------
A   1
B   1
C   1
D   2
E   2
F   3
G   3
H   3
I   1
J   1

任何人都可以帮助我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

可能有更优雅的解决方案,但我发现了这一点(没有cursor)。 @tbl是可变的,因此需要此变量。

declare @tbl table(id int identity(1,1), col1 char,col2 char)
insert @tbl values
('A',   'B'),
('A',   'C'),
('B',   'C'),
('D',   'E'),
('F',   'G'),
('G',   'H'),
('I',   'A'),
('J',   'I')

declare @c1 char, @c2 char, @par int=1, @rowcnt int,@id int, @tmpPar int
--target table
declare @groups table(col char,parent_id int)
--setup vars
select top 1 @c1=col1,@c2=col2, @id=id from @tbl order by id
--insert 2 rows into groups
insert @groups values(@c1,@par),(@c2,@par)
--remove processed row
delete @tbl where id=@id
set @rowcnt=@@ROWCOUNT

--do remaining in a cicle
while @rowcnt>0
begin
    select top 1 @c1=col1,@c2=col2, @id=id from @tbl order by id
    select @tmpPar=parent_id from @groups where col =@c1 or col= @c2
    --
    if @tmpPar is null
        select @tmpPar=@par+1,@par=@par+1--new group

    --add new rows
    insert @groups values(@c1,@tmpPar),(@c2,@tmpPar)
    delete @tbl where id=@id
    set @rowcnt=@@ROWCOUNT
    set @tmpPar=null --reset var
end

--final result
select distinct * from @groups