2012-10-10 5 views
5

Ich habe eine Situation und ich bin schwach bei SQL. Hier ist es.SQL-Update eine Spalte, die Reihenfolge verloren hat?

Ich habe Artikel archiviert, die mit einer Nummer gespeichert sind. So ist es in der Datenbanktabelle.

RowId Number CaseId 
234  1  787 
235  2  787 
236  3  787 
237  4  787 
238  5  787 

So sieht es beim ersten Einfügen aus. Aber nach dem Löschen, nimm Nummer 3 ist gelöscht, so ist es jetzt auf DB.

RowId Number CaseId 
234  1  787 
235  2  787 
237  4  787 
238  5  787 

3 ist weg aber was ich brauche ist das.

RowId Number CaseId 
234  1  787 
235  2  787 
237  3  787 
238  4  787 

Die Nummern sollten ebenfalls aktualisiert werden. Aber ich kann keinen Weg finden, dies zu tun. Übrigens gibt es viele CaseId's. Ich werde die ganze Tabelle nicht aktualisieren, ich werde sie durch eine CaseId auswählen. Kannst du mir sagen, wie ich das mache? Ich verwende C# .NET

Sollte ich sie zu einer Liste (die Art, wie sie von Select Query bestellt werden) nehmen und eins nach dem anderen überprüfen und sie dann aktualisieren? Ich kann den Scheck eins nach dem anderen auf C# schreiben, aber ich denke, es wird nicht effizient sein. Was ist ein effizienter Weg dies zu tun?

+2

müssen Sie die "Nummer" speichern können Sie nicht nur berechnet, wenn Sie aus der Tabelle auswählen? –

+2

Dann brauchen Sie keine "wahre" Spalte "Nummer". Einfach OrderBy RowId und row_number() verwenden –

+1

In dem Fall werde ich vorschlagen, Nummer in Ihrer Datenbank nicht zu speichern. Wenn Sie das obige Ergebnis benötigen, schreiben Sie einfach eine SELECT-Abfrage mit Row_number(). für weitere Informationen siehe sie: http://msdn.microsoft.com/en-us/library/ms186734.aspx –

Antwort

4

Muss die Nummer in der Datenbank selbst aktualisiert werden? Wenn nicht, müssen Sie das sogar speichern? Schreiben Sie auch SQL-Abfragen? Oder einfach Entity Framework verwenden? Wenn Sie tatsächlich Abfragen schreiben, und wenn Sie nur die Zeilennummer wünschen, wenn Sie wählen die Daten sichern Sie so etwas wie versuchen:

SELECT RowId, ROW_NUMBER() OVER (ORDER BY RowId ASC) AS [Number], CaseId 
FROM [MyTable] 
WHERE CaseID = 787 

EDIT: Wie @ Mike in den Kommentaren darauf hingewiesen, wäre es wahrscheinlich machen Sinn, einen Blick darauf zu werfen. Sie können [Nummer] aus der primären Tabelle entfernen und einen Blick machen wie:

CREATE VIEW dbo.MyView 
AS 
    SELECT RowId, 
    ROW_NUMBER() OVER (PARTITION BY CaseId ORDER BY RowId ASC) AS Number, 
    CaseId FROM MyTable 

Die PARTITION Erklärung dafür sorgen, dass Nummer für jede unterschiedliche RowId setzt

+1

+1 - Dies ist eine viel bessere Lösung, wenn es möglich ist und weiter eine Ansicht oder gespeicherte Prozedur erstellt werden könnte, die noch durch das Entity Framework genutzt werden könnte. –

+0

Ich muss die Nummer in der DB speichern. Es wird für die Suche verwendet. Kann ich das in der Datenbank tun, ohne es zuerst zu laden und dann zu aktualisieren? – Ada

+0

@Ada, können Sie sicherlich gegen eine Ansicht abfragen, und wenn Sie nicht finden, dass es ** schwere ** Leistungsprobleme verursacht, würde ich es so machen. Einen Integer-Wert wie den in dieser Frage in einer Tabelle zu speichern, ist vergleichbar mit dem Speichern des Gesamtpreises eines Kundenauftrags - es ist eine schlechte Idee, weil es sehr schwer zu pflegen ist. –

1

Dies kann mit ROW_NUMBER erreicht werden(), einem Tabellenvariable und ein Update über zwei Tabellen!

Verwandte Themen