SQL Server数据库中的排序列表

SQL Server数据库中的排序列表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想知道在数据库中维护一个排序列表是否可能/好 例如,我有一个优先级为1~100的项目列表。每次我插入时,数据库都可以将其插入正确的位置,这样当我调用时,选择(20),数据库就可以返回优先级最高的前20项。添加一个名为priority的字段。适当填充数据并按其排序,根据您的数据库选择前20名,例如: SELECT TOP 20 [Your fields here] FROM table ORDER BY priority 或 为字段添加索引可能也是一个好主意 这是一个非常持久的解决

我想知道在数据库中维护一个排序列表是否可能/好


例如,我有一个优先级为1~100的项目列表。每次我插入时,数据库都可以将其插入正确的位置,这样当我调用
时,选择(20)
,数据库就可以返回优先级最高的前20项。

添加一个名为priority的字段。适当填充数据并按其排序,根据您的数据库选择前20名,例如:

SELECT TOP 20 [Your fields here] 
FROM   table 
ORDER  BY priority 

为字段添加索引可能也是一个好主意

这是一个非常持久的解决办法。任何其他利用行在表中物理存储顺序的解决方案都是非常脆弱的

我想知道这是否可能/好 在数据库中维护已排序的列表

请参阅@Conrad Frix的答案,以发现这确实是可能的(使用窗口函数
ROW_NUMBER()
是另一种方法,它的优点是作为标准SQL并在SQL Server中受支持)。请注意,这将向表中添加一列(如果愿意的话,是relvar的属性),该表不是“排序列表”,但似乎是您所需要的

这是个好主意吗?显然,如果这是应用程序/企业的一项要求,那么在数据库中维护这些值确实是合适的

每次插入时,数据库都可以 将其插入正确的位置


请注意,如果有100行具有唯一的
优先级
属性值1-100,并且需要
优先级=55
处插入一个值,则现有值55-100需要增加1,并且数据库不会为您这样做,除非您在数据库对象中编写了过程代码(例如触发器)。如果您只需要管理
插入
s(而不是
更新
s或
删除
s)然后预取一个更好的方法是从更大的间隔开始,例如,最初的100行可以有
优先级
值1000、2000、3000、…100000。现在,与以前相同的
插入
可以在54000和55000之间,方法是将属性
优先级=54500
分配给它,而无需重新分配任何值。

I我认为这是一个持久的解决方案,直到数据库支持ANSI
FETCH FIRST#ROWS ONLY
@OMG Ponies。好吧,这很公平。你会说它与供应商特定实施的供应商一样持久吗?这是正确的解决方案。只需在PK或聚集索引中包含优先级作为最后一列,或者创建一个唯一的非clus索引正常(主键,优先级)你会没事的。然后顺序是有保证的,而不是特定于实现的。我倾向于做一件大多数人觉得奇怪的事,就是将优先级列设为浮点。这样,你通常可以通过平均优先级在任何两个现有行之间插入一个新行。只有极少数情况下,你需要对多行的优先级重新编号。
SELECT [Your fields here] 
FROM   table 
ORDER  BY priority 
LIMIT 20