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