2017-07-04 3 views
0

i Tabelle mit 9 Aufzeichnungen müssen zurückgesetzt, dass 2 Datensätze mit _id = 1 gelöscht wurde:wie den Spaltenwert

id | name | index | _id 
1  a   1    1 
8  b   3    1 
9  c   7    1 
10  d   4    1 
15  e   2    1 
16  d   1    2 
17  e   2    2 

und ich möchte den Index _id = 1 wie folgt zurück:

id | name | index | _id 
1  a   1    1 
8  b   2    1 
9  c   3    1 
10  d   4    1 
15  e   5    1 
16  d   1    2 
17  e   2    2 

ich würde diese Abfrage verwenden

declare @_idCount int = (select count(*) from tbl where _id = 1), 
     @index int = 1 

while(@_idCount > 0) 
    begin 
     update tbl 
     set code = @index 
     where _id = 1 

     set @index = @index + 1 
     set @picCount = @picCount - 1 
    end 

aber dieser Code alle Datensatz mit dem gleichen Code eingestellt. was kann ich tun, um es zu lösen?

Antwort

1

Sie können einfach verwenden ROW_NUMBER:

WITH CTE AS 
(
    SELECT id, 
      name, 
      [index], 
      [_id], 
      new_index = ROW_NUMBER() OVER(PARTITION BY [_id] 
             ORDER BY [id]) 
    FROM dbo.tbl 
) 
UPDATE CTE 
SET [index] = new_index; 
+0

es Ihnen danken! es war so nützlich –

Verwandte Themen