2011-05-23 13 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之間而不需要重新分配任何值。

相關問題