2011-05-23 14 views
2

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

例如,我有一个优先级为1〜100的项目列表。每次插入时,数据库都可以将其插入适当的位置,以便在拨打.select(20)时,数据库可以返回具有最高优先级的前20项。

回答

6

添加称为优先级的字段。用适当的数据填充并按数据排序,并根据数据库选择排名前20位的数据。

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

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

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

这是一个非常耐用的解决方案。任何其他解决方案都会利用这些行物理存储在表中的顺序,这将非常脆弱。

+0

我对所有这些都持久的解决方案犹豫不决,直到数据库支持ANSI'FETCH FIRST#ROWS ONLY'。 – 2011-05-23 22:57:12

+0

@OMG小马。好,可以。你会说它与供应商具体实施的供应商一样持久吗? – 2011-05-23 22:58:50

+1

这是正确的解决方案。只需将优先级作为PK或聚簇索引中的最后一个列,或者创建一个唯一的非聚簇索引ok(PK,优先级),您就可以正常使用了。然后订单得到保证,而不是具体的实施。 – usr 2011-05-23 22:59:34

1

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

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

是个不错的主意?显然,如果这是您的应用程序/企业的需求,那么维护数据库中的值确实是合适的。

我每次插入,数据库可以 将其插入到适当的位置

需要注意的是,如果你有100行具有独特priority属性值1-100,你需要INSERT在值,例如,priority = 55,现有值55-100需要增加1,除非您已经在数据库对象中编写过程代码(例如触发器),否则数据库不会为您执行此操作。如果您只需要管理INSERT(而不是UPDATEDELETE),那么可以采取更好的方法,以更大的间隔开始,您的最初100行可能有priority值1000,2000,3000,... 100000。现在与之前相同的INSERT可以通过将属性priority = 54500分配给54000和55000之间而不需要重新分配任何值。

相关问题