create table #Something( ChildID int, ChildName varchar(20), ParentID int, PID int)insert #Somethingselect 100, 'Bingo', 200, 1 union allselect 101, 'Pingo', 201, 1 union allselect 102, 'Zingo', 201, 1 union allselect 100, 'Bingo', 201, 2 union allselect 101, 'Pingo', 200, 2 union allselect 102, 'Zingo', 201, 2 union allselect 100, 'Bingo', 201, 3 union allselect 101, 'Pingo', 201, 3 union allselect 102, 'Zingo', 200, 3 union allselect 100, 'Bingo', 200, 4 union allselect 101, 'Pingo', 201, 4 union allselect 102, 'Zingo', 200, 4select * from #Somethingdrop table #Something
create table #abc (insertid int, cityid int, parentcityid int, cityname varchar(50), parentname varchar(50) ,PRIMARY KEY CLUSTERED (insertid, cityid, parentcityid))insert into #abcselect 1,10,11,'A','B'union all select 1,11,12,'B','C'union all select 1,12,13,'C','D'union all select 2,10,11,'A','B'union all select 2,11,13,'B','D'union all select 2,12,11,'C','A'
DECLARE @NextParentID INT = 0, @CityID INT = 0UPDATE aSET @NextParentID = CASE WHEN parentcityid >= @NextParentID THEN parentcityid + 1 WHEN CityID >= @NextParentID THEN CityID + 1 ELSE @NextParentID END ,@CityID = CityID = CASE WHEN ( SELECT CityID FROM #abc b WHERE b.InsertID = a.InsertID - 1 AND b.cityid = a.cityid AND b.parentcityid <> a.parentcityid) IS NULL THEN CityID ELSE CASE WHEN @CityID >= @NextParentID THEN @CityID + 1 ELSE @NextParentID END ENDFROM #abc aOPTION (MAXDOP 1)SELECT * FROM #abcDROP TABLE #abc