MERGE表,ID为VALUES关键字的值

时间:2017-12-28 07:03:20

标签: sql sql-server

我有一个简单的静态表:

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

3 个答案:

答案 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);