2016-06-10 1 views
0

У меня есть данные, как показано ниже со всеми ссылками между несколькими учетными записями.Как создать общий/родительский идентификатор для всех связанных значений в SQL?

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

Я бы хотел создать общий идентификатор для всех учетных записей ссылок. В приведенном выше примере A, B, C, I, J связаны. Поэтому они должны получить одинаковый идентификатор.

Мои конечные данные должны выглядеть примерно так, как показано ниже.

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

Может ли кто-нибудь помочь мне здесь. Заранее спасибо.

+1

Вы сделали свой пример настолько абстрактным, что это не имеет большого смысла. Откуда берутся цифры? Вы можете значительно улучшить свой вопрос, следуя советам здесь. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ Я подозреваю, что вам понадобится рекурсивный цит, чтобы решить вашу проблему, но, возможно, мы будем больше знайте, как только вы предоставите более подробную информацию. –

+0

Спасибо за совет Шон. Начнем с этого. Чтобы ответить на ваш вопрос, Parent_Id - это инкрементное число, которое мне нужно создать для связанных имен. В таблице ввода показаны все ссылки. – PruBon

+0

Но инкрементально от чего? Почему A получает 1, и он не увеличивается до D? Я могу помочь вам здесь, но вам нужно предоставить достаточно подробностей, чтобы ваш вопрос имел смысл. –

ответ

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 [email protected] 
set @[email protected]@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 [email protected] or col= @c2 
    -- 
    if @tmpPar is null 
     select @[email protected]+1,@[email protected]+1--new group 

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

--final result 
select distinct * from @groups 
Смежные вопросы