2009-05-29 10 views
3

Ich habe eine Tabelle, die eine Spalte mit der Bezeichnung "sortorder" hat, die verwendet wird, damit der Kunde die Reihenfolge jedes Artikels manuell ändern kann. Die Tabelle enthält außerdem eine Spalte mit der Bezeichnung "CategoryId".Inkrementieren Wert basierend auf Kriterien in einer einzigen Datenbankabfrage

Ich war neugierig, wenn ich eine Menge von Daten, in denen ich alle Daten einschließlich CategoryId kannte, importieren würde, wie ich den incrimenting Wert für 'SortOrder' innerhalb der Abfrage angeben könnte, so dass es von 1 zu X ging innerhalb jeder eindeutigen CategoryId.

Danke an alle.

Antwort

9

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe, aber ich denke,, was Sie fragen, ist, wie eine geeignete SortOrder während einer Einfügung in die Tabelle zu synthetisieren. Sie sollten ROW_NUMBER() mit Partitionierung von CategoryId verwenden. Natürlich müssen Sie ein Sortierkriterien definieren, die die propert Reihenfolge von ‚1 bis X‘ gibt:

INSERT INTO myTable (SortOrder, CategoryId, <other columns> ...) 
SELECT ROW_NUMBER() OVER (PARTITION BY CategoryId ORDER BY mySortCriteria) 
    , CategoryId 
    , <other columns> ... 
    FROM SourceTable; 
+0

Sie haben meinen Tag gerettet, danke. Ich weiß über ROW_NUMBER() für SQL 2005, aber ich wusste nicht über den Parameter PARTITION BY. Vielen Dank. –

+0

Fensterfunktionen FTW! Funktioniert möglicherweise nicht mit etwas anderem SQL Server 2005. –

+0

gute Antwort - du schlägst mich dazu :) –

1

klingt wie Sie benötigen verwenden, um die row_number Funktion in Ihrem Import.

0

Für alle, die später noch in SQL Server 2000 kommen, ist hier eine andere Möglichkeit, um die Aufgabe zu erfüllen.

Mithilfe einer Zwischenspeichertabelle, um die Daten aus der Masseneinfügung zu reparieren. Stellen Sie sicher, dass es eine Spalte namens sortorder enthält, die initial mit einer 1 und einer identitätsbasierten ID-Spalte gefüllt wird.

dann können Sie dies mit einem selbst aktualisieren verbinden, so etwas wie

update t 
set sortorder = t1.sortorder +1 
from test t 
join Test t1 on t.id = t1.id+1 

dann die Daten in Ihren prod Tisch.

Verwandte Themen