我有一张表Items
,例如
ID Name ItemOrder
----------------------
16 Albania 1
13 Chile 2
11 Barbados 3
10 France 4
...
我在客户端应用程序中显示为
SELECT * FROM Items ORDER BY ItemOrder
我希望能够"移动"例如Albania
和Barbados
之后(或之前取决于我的参数)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
以反映新订单。
有一种简单有效的方法吗?
答案 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
订单号并添加“阿尔巴尼亚'巴巴多斯'”的分数,以便:
修改强>
'之前'如果我们替换这一行,可以实施案例:
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