2010-11-04 9 views
5

W tabeli Chcę móc "przesuwać" wiersze, mam kolumnę o nazwie sortid, która automatycznie na insertie jest jedną wartością wyższą niż najwyższa wartość (łatwo znaleźć, wybierając najwyższą wartość podczas sortowania mojego sortid desc).Przenoszenie wierszy "w górę i w dół" w bazie danych (pomoc do zapytania SQL)

Ale jestem trochę zdezorientowany, jakie zapytanie użyję dla akcji "góra/dół" dla każdego wiersza na mojej stronie ASP.NET. Jakiego zapytania użyłbym do wybrania wierszy bezpośrednio "poniżej" lub "powyżej" do przeniesienia wiersza?

Dzięki

Odpowiedz

7

Przenoszenie rekordu w górę lub w dół odbywa się poprzez zamianę go odpowiednio przed lub po.

Jeśli wartości SortId są zawsze ciągłe (tzn. Nie usuwa się zapisów, które mogłyby spowodować lukę), można po prostu dodać lub odjąć jedną, aby uzyskać następny lub poprzedni rekord. Jeśli zapisy nie mają ciągłości, musisz znaleźć rekord obok tego, który chcesz przenieść.

Aby znaleźć SortId rekordu wcześniej:

select max(SortId) from TheTable where SortId < @SortId 

Aby znaleźć SortId rekordu po:

select min(SortId) from TheTable where SortId > @SortId 

Aby zamienić dwa rekordy, można użyć tego triku, który oblicza jeden wartość z drugiej:

update TheTable 
set SortId = @SortId1 + @SortId2 - SortId 
where SortId in (@SortId1, @SortId2) 
+0

Podoba mi się Twoje rozwiązanie – kta

3

Jedną z opcji jest przyrost wszystkie sortid pola wierszy „poniżej” tuż przed INSERT ing nowy wiersz. Możesz to zrobić za pomocą polecenia UPDATE, po którym następuje polecenie INSERT. Powiedzmy, że jesteś wstawiania wiersza w pozycji 10. Następnie można zrobić coś takiego:

UPDATE your_table SET sortid = sortid + 1 WHERE sortid >= 10; 
INSERT INTO your_table (..., sortid) VALUES (..., 10); 

Należy owinąć pewnie, że aż w transaction aby upewnić się, że operacja zostanie przeprowadzona atomically.

Jeśli chodzi o działania w górę/w dół, nie trzeba wykonywać INSERT. Powyższe jest właściwe tylko dla dodania nowych wierszy w określonej "lokalizacji". W przypadku akcji w górę/w dół możesz po prostu "zamienić" wartość sortid dwóch wierszy, jako @Guffa suggested in the other answer.

1

Aby uzyskać wiersze powyżej wiersza docelowego.

select * from [TableName] 
where sortid > (select sortid from [TableName] 
       where id = @id) 

Zamiast tych, po prostu użyj <.

Powiązane problemy