2017-08-10 7 views
-2

Gibt es eine Möglichkeit, eine automatisch inkrementierende Zahlenfolge in einer bestimmten Tabellenspalte mit T-SQL zu korrigieren?Zahlenfolge mit SQL korrigieren

Lets sagen, dass ich eine Tabelle, die wie folgt aussieht:

Id Bar Foo 
    2  5 1 
    3  6 1 
21  7 1 
22 16 1 
154 17 1 
176 18 1 

Ich mag würde Reihen mit Foo = 1 in einer Art und Weise aktualisieren, dass sie die Bar Spaltenreihenfolge von Reihe mit bestimmten Id beginnend weiter (in diesem Fall können mit Id = 21 Zeile wählen) und gilt für alle folgenden Reihen auf der Id Spaltenreihenfolge basiert

Das Endergebnis wäre:

Id Bar Foo 
    2  5 1 
    3  6 1 
21  7 1 
22  8 1 
154  9 1 
176 10 1 

Für mehr Kontext:

Die Tabelle speichert Dateidaten für einen bestimmten Speicherort (Standort-ID ist "Foo" aus Beispiel). Jede Zeile ist eine Datei und hat ihre Dateinummer (Dateinummer ist 'Bar' aus Beispiel).

Die Dateinummer wird bei der Dateierstellung basierend auf der aktuell größten Dateinummer für diesen Speicherort bestimmt. Wegen irgendeines Fehlers hat die Dateinummer einiges vorausgelassen, was eine Lücke in der Dateinummernreihenfolge gelassen hat, und ich möchte diese Lücke mit T Sql beheben.

+2

Wenn Sie "automatisch inkrementieren" sagen, worüber ** genau ** sprechen Sie? Eine Identitätsspalte? –

+1

* Lässt die Zeile mit 'Id = 14' auswählen * ... es gibt keine solche Zeile in den bereitgestellten Daten –

+3

Wenn Sie nur einen dummen Inkrementierungswert haben möchten, der keinen Einfluss auf die Daten hat (wenn Sie 16 auf 8 und 17 zurücksetzen können) bis 9 und das hat keine Auswirkungen, was ist der Punkt?), warum nicht einfach diese Sequenz generieren, wenn Sie die Daten abfragen? ROW_NUMBER() kann das tun, ohne eine Spalte zu haben, die Sie pflegen müssen. Das Problem beim Speichern dieser bedeutungslosen Daten besteht darin, dass Sie sie jedes Mal zurücksetzen müssen, wenn eine Zeile geändert wird. –

Antwort

2

Id Unter der Annahme, ist das Feld, das Zeilenfolge bestimmt, können Sie die folgende Abfrage UPDATE verwenden:

;WITH ToUpdate AS (
    SELECT Id, Bar, 
      FIRST_VALUE(Bar) OVER (ORDER BY Id) + 
      ROW_NUMBER() OVER (ORDER BY Id) - 1 AS newBar 
    FROM mytable 
    WHERE Foo = 1 AND Id >= 21 
) 
UPDATE ToUPDATE 
SET Bar = newBar 

Demo here

Wie bereits in einem Kommentar erwähnt, können Sie den Bar Wert aus einer Abfrage erhalten wie der von der CTE verwendete. Es ist also nicht wirklich notwendig, einen solchen Wert in einer Spalte Ihrer Tabelle zu speichern.

+0

Das war's! Auch danke für Informationen über CTE –

Verwandte Themen