Order-By

SQL 中使用者定義的排序

  • March 22, 2018

我剛剛閱讀了一篇關於使用者定義結果集排序的有趣部落格文章。

一些應用程序,例如待辦事項列表,需要維護使用者定義的項目順序。挑戰在於順序是任意的,並且可以在使用者重新排列項目時更改

一個範例表可能是這樣的:

create table items
(
 itemid int primary key,
 itemdata varchar(200),
 ...
 ...
 userorder ??? 
);

使用可能的檢索查詢:

select * from items order by userorder asc;

鑑於我想將更新保持在最低限度,更新原子和檢索查詢盡可能簡單和“高性能”,是否有任何方法可以考慮?

我最初的想法是使用一個額外的TIMESTAMP列,並且只更新單行userorder的值(檢索查詢使用ing by ),但是當您需要在具有相同值的其他兩行之間移動一行時,這會失敗.timestamp``ORDER``userorder asc, usertimestamp desc

沒有考慮特定的數據庫,因為我自己使用的範圍很廣。

介紹

一些非常古老的 BASIC 語言要求每一行程式碼都有一個行號。

程式時,行號通常以 10 的倍數間隔。這使您可以在以後的行之間添加更多程式碼。

您的items表應遵循相同的概念。

基本算法

  1. 以 10 的倍數開始的值以userorder10 開始userid
  2. userorder根據需要更新應用程序
  3. 您重新編號該使用者userorder使用 Analytics
  4. ‘userorder’ 的值保持為 10 的倍數。
  5. commit數據變化。

重列舉程式碼

這基本上是我用過的:

merge into items a
using (
 select i.itemid
   ,10 * row_number() over (partition by i.userid order by i.userorder)
     as new_userorder
 from items i
 where i.userid=?
) b
on (a.itemid = b.itemid)
when matched then update
 set a.userorder=b.new_userorder
;

我假設此表包含每個人的 TODO 列表,並且每​​個使用者都由userid.

此範例使用ROW_NUMBER()來自 Oracle。您必須將它替換為您正在使用的任何 RDBMS。

引用自:https://dba.stackexchange.com/questions/201898