永久移动和重新订购记录

时间:2016-02-18 13:44:12

标签: sql-server tsql

我有一张表Items,例如

ID  Name     ItemOrder
----------------------
16  Albania  1
13  Chile    2
11  Barbados 3 
10  France   4
...

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

SELECT * FROM Items ORDER BY ItemOrder

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

13  Chile    1    
10  France   2 
16  Albania  3 
11  Barbados 4 

Before的结果是:

13  Chile    1        
16  Albania  2 
11  Barbados 3 
10  France   4 

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

2 个答案:

答案 0 :(得分: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

诀窍是获取France's订单号并添加“阿尔巴尼亚'巴巴多斯'”的分数,以便:

  • '阿尔巴尼亚','巴巴多斯'位于' France'
  • 之后
  • '阿尔巴尼亚'和巴巴多斯'维持他们之间的顺序
  • ' France'之后的记录顺序也保持着。

Demo here

修改

'之前'如果我们替换这一行,可以实施案例:

WHEN Name IN ('Albania', 'Barbados') THEN x.o + ItemOrder * 0.1 

这一行:

WHEN Name IN ('Albania', 'Barbados') THEN x.o - 1.0/ItemOrder * 0.1  

答案 1 :(得分:1)

(注意:这个答案是在你更新问题之前写的,提到你需要更新 ItemOrder。)

首先,在条目之间加上空格

SELECT ID, name, ItemOrder * 10 AS newOrder FROM Items

现在我们修改SQL以将“特殊的”放在其间:

SELECT ID, name, ItemOrder
       CASE WHEN name = 'Albania'
            THEN (SELECT ItemOrder FROM Items WHERE name = 'France') * 10 + 1
            WHEN name = 'Barbados'
            THEN (SELECT ItemOrder FROM Items WHERE name = 'France') * 10 + 2
            ELSE ItemOrder * 10
        END AS newOrder
  FROM Items

现在我们可以按它排序:

SELECT ID, name, ItemOrder
  FROM (... see previous SQL ...) AS t
 ORDER BY newOrder