2016-06-10 2 views
0

Ich habe Daten wie unten mit allen Verbindungen zwischen mehreren Konten.Wie erstellt man eine gemeinsame/übergeordnete ID für alle verknüpften Werte in SQL?

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

Ich möchte gemeinsame Id für alle Links Konten erstellen. Im obigen Beispiel sind A, B, C, I, J verknüpft. Also sollten sie dieselbe ID bekommen.

Meine Enddaten sollten etwas ähnlich wie unten aussehen.

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

Kann mir hier jemand helfen. Danke im Voraus.

+1

Sie haben Ihr Beispiel so abstrakt gemacht, dass es nicht viel Sinn ergibt. Woher kommen die Zahlen? Sie können Ihre Frage erheblich verbessern, indem Sie den folgenden Ratschlägen folgen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ Ich vermute, dass Sie eine rekursive Cte ​​brauchen, um Ihr Problem zu lösen, aber vielleicht werden wir mehr wissen, sobald Sie mehr Details zur Verfügung stellen. –

+0

Danke für den Rat Sean. Werde danach anfangen. Um Ihre Frage zu beantworten, Parent_Id ist eine inkrementelle Nummer, die ich für die verknüpften Namen erstellen muss. Die Eingabetabelle zeigt Ihnen alle Links. – PruBon

+0

Aber inkrementell von was? Warum erhält A 1 und erhöht sich nicht wieder bis D? Ich kann Ihnen hier helfen, aber Sie müssen genügend Details angeben, damit Ihre Frage sinnvoll ist. –

Antwort

0

Wahrscheinlich gibt es elegantere Lösung, aber ich fand dies nur (Nr. cursor). @tbl ist veränderbar, daher ist diese Variable erforderlich.

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 
Verwandte Themen