2016-11-22 5 views
1

하나의 쿼리에서 여러 레코드를 업데이트하는 주소 인 this 질문을 살펴 보았습니다.SQL - 복합 키를 사용하여 하나의 쿼리에서 여러 레코드 업데이트

일반적인 솔루션은

UPDATE table_name 
SET field_to_update = CASE table_key 
        WHEN key_value1 THEN field_value1 
        WHEN key_value2 THEN feild_value2 
        ELSE feild_to_update 
        END 
WHERE table_key IN(key_value1 , key_value2); 

내 질문이이 복합 키에 대한 수용하기에 적합 할 수있는 사람입니다. 내가 열을 가지고 있다고 말하십시오.

여기서 id_1과 id_2는 복합 기본 키를 형성합니다.

id 열 중 하나가 특정 쿼리에 대해 일정하다는 사실로 인해 문제가 간단 해졌습니다. 예를 들어

, 나는

UPDATE table_name 
SET field_to_update = CASE (key1, key2) 
       WHEN (1,1) THEN field_value1 
       WHEN (2,1) THEN feild_value2 
       ELSE feild_to_update 
       END 
WHERE (key1, key2) IN ((1, 1) , (2, 1)); 

수있는 사람의 도움을 바랍니다의 라인을 따라 뭔가가 필요? 2 피연산자

이기 때문에

+0

경우에 대체 할 수 있습니다 2 피연산자입니다 – scaisEdge

+0

예, 저는 알고 있습니다.하지만 저는 할 수 있기를 원하는 것에 만 가고 싶었습니다. 심지어 그것은 완전히 다른 구문을 요구합니다. –

+0

'CASE'의 다른 형태가 있습니다; '상황 [조건] 그 다음 [어쩌면] [조건 2] 그 다음 [어쩌면 2 .... .... 느리게 ....]. – Uueerdo

답변

1

경우 튜플의 사용은 "피연산자 1 열 (들)을 포함해야"오류가 이 당신이 귀하의 경우처럼 튜플을 사용하는 경우 경우는 하나의 피연산자를 허용 할 수 없습니다 하지만 당신은 당신이 귀하의 경우처럼 튜플을 사용하는 경우 오류 "피연산자 1 열 (들)을 포함해야한다"때문에가있는 경우에만 피연산자에 대해 허용 일부 CONCAT 예를 들어 조작 (그리고 암시 적 변환)

UPDATE table_name 
    SET field_to_update = CASE concat(key1, key2) 
       WHEN concat(1,1) THEN field_value1 
       WHEN concat(2,1) THEN feild_value2 
       ELSE feild_to_update 
       END 
    WHERE concat(key1, key2) IN (concat(1, 1) , concat(2, 1)); 
+0

완벽한 솔루션입니다. 감사합니다 –

+0

@ 코노 비숍. 감사합니다. 잘못된 긍정을 피하기위한 정확한 조작을 사용하십시오. (두 개의 다른 값이 동일하게됩니다.) – scaisEdge

+0

@scaisEdge 이렇게하는 좋은 방법은 일반적으로 두 값 사이에있을 법하지 않은 문자열을 추가하는 것입니다. 예를 들어 숫자의 경우'CASE CONCAT (key1, '|', key2) '1 | 1'THEN ... ' – Uueerdo