2017-02-20 1 views
0

일부 사례 문과 함께 업데이트 쿼리를 작성했습니다. 대/소문자가 만족하지 않으면 NULL로 열을 업데이트합니다. 그것은 항상 NULL를 채울
하위 쿼리 및 사례 문을 사용한 업데이트

UPDATE TGT 
SET C1 = CASE WHEN TGT.c2 = SRC.c2 AND SRC.C3 = 'P' THEN SRC.C1 ELSE NULL END, 
    C4 = CASE WHEN TGT.c5 = SRC.c5 AND SRC.C3 = 'D' THEN SRC.C4 ELSE NULL END 
    FROM SRC; 

에도 데이터가 소스 테이블에 존재한다 : 다음
는 쿼리입니다.

감사의 말 전진 해드립니다.

+0

아무 것도 업데이트하지 않고이 쿼리가 실행됩니까? 아니면 오류가 있습니까? – Aleksej

+0

아니요, 이것은 단일 쿼리입니다. 테이블의 모든 레코드를 업데이트하지만 NULL 값만 있습니다. – Biswabid

+0

그리고이 Oracle입니까? – Aleksej

답변

2

오라클은 update 문에 from 또는 join을 지원하지 않습니다. 그러나 하위 쿼리를 사용할 수 있습니다.

UPDATE TGT 
    SET C1 = (CASE WHEN EXISTS (SELECT 1 
           FROM SRC 
           WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P' 
        THEN TGT.C1 ELSE NULL 
       END); 

참고 : 위의 내용은 모든 행을 업데이트합니다. 당신은 그냥 일치하지 않는 행을 업데이트 할 경우, where 절에 not exists를 사용

UPDATE TGT 
    SET C1 = NULL 
    WHERE NOT EXISTS (SELECT 1 
         FROM SRC 
         WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P' 
        ); 
+0

1 열만 업데이트 할 때이 방법을 사용할 수 있습니다. 둘 이상의 열을 업데이트해야하는 경우 도움이되지 않습니다. 그것은 성능 문제도 줄 수 있습니다. 이견있는 사람?? – Biswabid

+0

@ 비스와 이드 : 하나 이상의 열을 업데이트해야하는 경우'set (c1, c2, c3) = (select x1, x2, x3 from ...)'과 같은 것을 사용하십시오. –

0

당신은 src에는 관련 'P'기록이없는 경우 c1 널 (null)을 설정합니다. 따라서 NOT EXISTS를 사용

UPDATE tgt 
SET c1 = NULL 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM src 
    WHERE src.c2 = tgt.c2 = AND src.c3 = 'P' 
); 

UPDATE를 : 당신은 당신의 질문을 변경하고 지금은 두 개의 서로 다른 상황에서 null을 설정하려면 두 개의 서로 다른 분야입니다. 간단히 말해서 두 문장을 사용하는 것이 좋습니다. 위의 내용은 c1이고, 다른 부분은 c4입니다. 실제 상황보다 복잡한 작업을 수행 할 필요가 없습니다.

관련 문제