我有一个简单的静态表:
SELECT [Id], [Order] FROM [Permissions]
返回
Id Order
1 4
2 5
4 6
8 7
16 8
32 9
64 2
128 3
256 0
512 1
我必须在订购方面做一些改变:
SELECT pid, ord FROM
(values (256, 0),(512, 1),(1, 2), (2, 3), (64, 4),(128, 5),(4, 6), (8, 7), (16, 8),(32, 9))
AS NewOrder(pid, ord)
我需要更新表Permissions
中的排序。
我认为MERGE声明将是一个正确的选择。
但即使在SO中,我也无法使用Id
语法找到MERGE的最简单的最小示例。
问题是如何将表与VALUES
关键字中的数据合并为Id
?
答案 0 :(得分:2)
如果您只是更新现有权限的顺序(即您没有插入任何其他权限),则只需使用UPDATE
语句。
例如:
UPDATE
Permissions AS pe
SET
pe.Order = upd.Order
FROM
(
VALUES
( 1, 1)
,( 2, 2)
,( 4, 3)
,( 8, 4)
,(16, 5)
) AS upd(Id, Order)
WHERE
pe.Id = upd.Id
答案 1 :(得分:1)
尝试:我认为简单的UPDATE
查询足以实现所需的输出。
create table #permission(id int, Eorder int)
insert into #permission values
(1,4),
(2,5),
(4,6),
(8,7),
(16,8),
(32,9),
(64,2),
(128,3),
(256,0),
(512,1)
UPDATE p SET p.Eorder = n.norder FROM(
SELECT * FROM
(VALUES (256, 0),(512, 1),(1, 2), (2, 3), (64, 4),(128, 5),(4, 6), (8, 7), (16, 8),(32, 9)) x (id, norder)) n
INNER JOIN #permission p ON n.id = p.id
<强>输出强>:
id Eorder
1 2
2 3
4 6
8 7
16 8
32 9
64 4
128 5
256 0
512 1
答案 2 :(得分:1)
由于您要求使用MERGE语法的解决方案,这里是您的查询 live demo
;
MERGE Permissions target
USING
(
SELECT pid, ord FROM
(values (256, 0),(512, 1),(1, 2), (2, 3), (64, 4),(128, 5),(4, 6), (8, 7), (16, 8),(32, 9))
AS NewOrder(pid, ord)
) source
ON (target.id = source.pid)
WHEN MATCHED THEN
UPDATE SET [Order] = ord
WHEN NOT MATCHED THEN
INSERT (id, [Order])
VALUES (pid, ord);