我有一张桌子,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)
我希望能够"移动"例如Albania
和Barbados
之后(或取决于我的参数)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
以反映新订单.有一种简单有效的方法吗?
您可以使用公用表表达式(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)