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
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. –
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
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. –