2017-12-28 7 views
1

나는 간단한 매우 정적 테이블이 있습니다MERGE 테이블

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 문이 올바른 선택이라고 생각합니다. 하지만 Id 구문을 사용하는 최소 병합의 MERGE를 찾을 수 없습니다.

질문은 VALUES 키워드의 데이터를 표와 병합하는 방법은 Id입니까?

+0

당신의 예상 출력은 무엇으로 당신을 위해 쿼리의 구문을 병합하여 해결책을 요구하기 때문에? – Sankar

+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   
+0

* 진짜 * 간단한 해결책을 가져 주셔서 감사합니다. –

1

TRY : 간단하다고 생각하면 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 

OUTPUT는 :

id Eorder 
1 2 
2 3 
4 6 
8 7 
16 8 
32 9 
64 4 
128 5 
256 0 
512 1 
1

당신은 여기 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); 
+0

실시간 데모 해줘서 고맙습니다. 'merge' 문에 대한 아주 간단한 예제입니다. –

+1

@ApceHHypocrite 큰 데이터 집합의 경우 병합 삽입 업데이트보다 느립니다. 그러나 그것은 INSERT 및 UPDATE에 대한 간결한 구문이며 INSERT 경우에 대해서만 생각하고 업데이트 할 수 없습니다. – DhruvJoshi