2013-02-17 147 views
0

在數據庫中,我有一個表,汽車行駛的兩列(位置,CarName),如:重新排序項

1 | BMW 
2 | Mercedes 
3 | Honda 
4 | Toyota 

表可以修改,因此添加新行「奧迪」應該是在頂部和重新排列如表:

1 | Audi 
2 | BMW 
3 | Mercedes 
4 | Honda 
5 | Toyota 

刪除 「本田」 之後:

1 | BMW 
2 | Mercedes 
3 | Toyota 

頂部移動的 「本田」 排後(第1位):

1 | Mercedes 
2 | BMW 
3 | Honda 
4 | Toyota 

什麼是SQL Server做的最好的和正確的方式:

1 | Honda 
2 | BMW 
3 | Mercedes 
4 | Toyota 

移動 「寶馬」 在第二位置後。

謝謝。

+4

你需要這樣做的原因是什麼? – 2013-02-17 11:34:58

+0

我想你可能需要一個新的專欄「CarRank」並使其增量,以便最後一個插入車的車輛排名最高。這就是你應該如何思考業務需求的思考。 – 2013-02-17 11:38:09

+0

是的,它可能是列CarRank,在這個例子中,我只是「位置」 – ihorko 2013-02-17 13:32:16

回答

2

訂單數據存儲在數據庫表中完全取決於數據庫引擎。你無法預測這一點。

什麼可以改變的是它在你的選擇查詢返回到您之前的數據進行排序的方式。你可以使用order by子句。

+0

我需要做到這一點,因爲沒有辦法按「排序」排序,最終用戶需要按照他們想要排序這些行/需要。 – ihorko 2013-02-17 11:56:57

+1

http://www.simple-talk.com/sql/learn-sql-server/effective-clustered-indexes/ – edze 2013-02-17 12:19:05

2

不要這樣做 - 讓SQL Server處理您的標識列。如果你想是這樣的,創建一個視圖使用ROW_NUMBER()以下SQL:

SELECT Row_Number() Over (Order By CarName) Rn, CarName 
FROM YourTable 
ORDER By CarName 

這裏是一個SQL Fiddle示範。

希望這會有所幫助。

+0

我是有身份的密鑰自動遞增,但也沒有辦法通過「排序依據」對它進行排序,用戶在最終需要根據需要對這些行進行排序。在你的例子中ORDER BY子句中的 – ihorko 2013-02-17 13:31:25

+0

是過度的。 OVER()強制整個語句進行排序http://sqlfiddle.com/#!3/64890/2 – 2013-02-17 14:05:56

+0

@ihorko - 這就是爲什麼最好將它用作View - 那麼用戶可以通過ORDER BY ASC或DESC和CarName ASC或DESC。希望這可以幫助。 – sgeddes 2013-02-17 14:25:38