2009-02-04 13 views
8

Ich habe vor kurzem etwa 60.000 Datensätze in eine Tabelle importiert, die Daten in einer Tabelle mit Daten in einer anderen Tabelle in Beziehung setzt. Allerdings hat mein Client seither angefordert, dass eine Sortierreihenfolge zu allen 60k-Datensätzen hinzugefügt wird. Meine Hoffnung ist, es gibt eine nette, saubere Möglichkeit, diese Sortierreihenfolgen in einem SQL-Update automatisch zu generieren. Die fertigen Daten sollten in etwa so aussehen:Automatisches Erzeugen von Sortieraufträgen mit SQL UPDATE

item1ID item2ID sortOrder 
1   123  1 
1   12  2 
1   45  3 
1   22  4 
1   456  5 
2   5   1 
2   234  2 
2   56  3 

Kann dies getan werden? Irgendwelche Vorschläge würden sehr geschätzt.

--Anne

Antwort

10

Sie könnten verwenden [ROW_NUMBER] [1] und die Partition von Item1ID

UPDATE t1 
SET t1.SortOrder = t2.SortOrder 
FROM @t t1 
INNER JOIN 
(SELECT Item1ID, Item2ID, ROW_NUMBER() OVER 
    (PARTITION BY Item1ID ORDER BY Item1ID, Item2ID) AS SortOrder 
from @t) t2 
ON t1.Item1ID = t2.Item1ID 
AND t1.Item2ID = t2.Item2ID 
+0

Das ist eine gute Möglichkeit, SortOrder zu ändern, um nach der zweiten Spalte über der ersten Spalte zu sortieren. Es war nicht klar, dass das das war, was das Poster verlangte, weil die Beispieldaten nicht nach den ersten beiden Spalten sortiert waren. Trotzdem, das ist eine großartige Antwort. – eksortso

+0

Bitte werfen Sie einen Blick auf die folgende Frage: http://stackoverflow.com/questions/1934738/custom-sort-order-with-sql-server-and-net-entity-framework – Shimmy

0

Theoretisch könnte man sagen:

update mytable 
    set sortOrder = row_number() 
    over (partition by item1id order by item1id, item2id) from mytable 

jedoch, dass geb Sie eine Fehlermeldung:

Msg 4108, Level 15, State 1, Line 1 
Windowed functions can only appear in the SELECT or ORDER BY clauses. 

Sie müssen es also tatsächlich in zwei Schritten tun - wählen Sie zuerst die Werte in einer temporären Tabelle aus und aktualisieren Sie dann Ihr Original aus der temporären Tabelle.

Zum Beispiel:

select 
    item1ID, 
    item2ID, 
    row_number() 
     over (partition by item1id order by item1id, item2id) as sortOrder 
    into #tmp 
    from mytable 

update mytable 
    set sortOrder = T.sortOrder 
    FROM 
    mytable M 
    inner join #tmp T 
     on M.item1ID = T.item1ID 
     AND M.item2ID = T.item2ID 

drop table #tmp 
1

Sie berühren hier auf etwas Grundsätzliches über das relationale Modell. In Datenbanken gibt es im Allgemeinen keine intrinsische Ordnung. Wenn Sie eine Datenbestellung immer dann durchführen möchten, wenn Sie sich eine Tabelle ansehen, müssen Sie diese Reihenfolge explizit angeben.

Also in einem allgemeinen Sinn, Sie fragen nach dem Unmöglichen. Sie können nicht nur eine Tabelle UPDATE und erhalten eine automatische Bestellung von jeder Abfrage, die Sie daran vornehmen. Aber in einer Query-by-Query Sinn, könnten Sie immer "ORDER BY item1ID, sortOrder" in jeder SELECT Anweisung setzen, die Sie auf die Tabelle anwenden.

In SQL Server 2005 können Sie einen Blick schreiben und an Ihren Kunden präsentieren, diese alte Hack:

SELECT TOP 100 PERCENT 
    item1ID, item2ID, sortOrder -- and all the other columns 
FROM YourTable 
ORDER BY item1ID, sortOrder; 

Es gibt Möglichkeiten, eine solche Sicht aktualisierbar, aber Sie werden für die Forschung brauchen das allein. Es ist nicht schwer zu tun.

Wenn Sie nie Daten in diese Tabelle einfügen oder ändern möchten und Sie die Daten erneut in eine Tabelle importieren möchten, können Sie Ihre Tabelle mit einer Identität definieren und dann Ihre Daten in die Tabelle einfügen in der richtigen Reihenfolge. Dann würden Sie immer nach der einen Identitätsspalte bestellen. Dies würde funktionieren, wenn Ihr Client die Daten immer in einem Programm anzeigt, das die Sortierung nach einer einzelnen Spalte zulässt. (BTW, benutzen Sie nie die IDENTITY Funktion für diesen Zweck. Es wird nicht funktionieren.)

CREATE TABLE YourTable (
    SingleSortColumn INT IDENTITY(1,1) NOT NULL, 
    ... 
); 
INSERT INTO YourTable (
    item1ID, item2ID, sortOrder -- everything except the SingleSortColumn 
) 
SELECT -- all your columns 
INTO YourTable 
FROM yadda yadda yadda 
ORDER BY item1ID, sortOrder; 

Hoffnung, die hilfreich ist. Tut mir leid, wenn ich pedantisch bin.

+0

Seien Sie vorsichtig mit den TOP 100 PROZENT und eine ORDER BY in einer Ansicht. Diese Syntax ist in SQL Server 2008 nicht mehr gültig. – mrdenny