永久移动和重新订购记录

zig*_*zig 6 t-sql sql-server

我有一张桌子,Items例如

ID  Name     ItemOrder
----------------------
16  Albania  1
13  Chile    2
11  Barbados 3 
10  France   4
...
Run Code Online (Sandbox Code Playgroud)

我在我的客户端应用程序中显示为

SELECT * FROM Items ORDER BY ItemOrder
Run Code Online (Sandbox Code Playgroud)

我希望能够"移动"例如AlbaniaBarbados之后(或取决于我的参数)France或任何其他记录.所以结果是(移动After记录France):

13  Chile    1    
10  France   2 
16  Albania  3 
11  Barbados 4 
Run Code Online (Sandbox Code Playgroud)

结果Before是:

13  Chile    1        
16  Albania  2 
11  Barbados 3 
10  France   4 
Run Code Online (Sandbox Code Playgroud)

我需要永久更新ItemOrder以反映新订单.有一种简单有效的方法吗?

Gio*_*sos 5

您可以使用公用表表达式(CTE)来执行UPDATE操作.对于'After'案例,这就是您的查询的样子:

;WITH ToUpdate AS (
  SELECT ID, Name, ItemOrder,
         ROW_NUMBER() OVER (ORDER BY temp_order) AS NewOrder
  FROM (
  SELECT ID, Name, ItemOrder,
         CASE 
            WHEN Name IN ('Albania', 'Barbados') THEN x.o + ItemOrder * 0.1 
          ELSE ItemOrder
         END AS temp_order
  FROM mytable 
  CROSS JOIN (SELECT ItemOrder FROM mytable WHERE Name = 'France') AS x(o)) AS t
)
UPDATE ToUpdate
SET ItemOrder = NewOrder
Run Code Online (Sandbox Code Playgroud)

诀窍是获得France's订单号并添加"阿尔巴尼亚","巴巴多斯"的一小部分,以便:

  • '阿尔巴尼亚','巴巴多斯'位于'法国'之后
  • "阿尔巴尼亚"和"巴巴多斯"维持着他们之间的秩序
  • "法国"之后的记录顺序也保持不变.

在这里演示

编辑:

如果我们替换此行,可以实现'Before'案例:

WHEN Name IN ('Albania', 'Barbados') THEN x.o + ItemOrder * 0.1 
Run Code Online (Sandbox Code Playgroud)

用这一行:

WHEN Name IN ('Albania', 'Barbados') THEN x.o - 1.0/ItemOrder * 0.1  
Run Code Online (Sandbox Code Playgroud)