重新排序项

问题描述:

在数据库中,我有一个表,汽车行驶的两列(位置,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

订单数据存储在数据库表中完全取决于数据库引擎。你无法预测这一点。

什么可以改变的是它在你的选择查询返回到您之前的数据进行排序的方式。你可以使用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

不要这样做 - 让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