2012-03-06 3 views
1

Oracle에서 임시 테이블에 대한 업데이트를 수행하고 있습니다. 내 생각에 NVL을 사용하여 값을 설정할 수있었습니다 (본질적으로 양쪽에서 null 값을 동일하게 설정).셀프 조인의 열이 Null이 아닌 경우 자체와 비교할 수 있습니까?

업데이트의 결과는 여러 비교가 true 인 경우 열이 업데이트되지 않으면 비교 된 열은 널 (NULL)이 될 수 있으며 오라클은 널 (NULL) 값을 비교하지 않습니다.

코드는 이해하기 쉽게 만들 수 있습니다. COLC 더 Null 값을 포함하지 않는하지만 난 행이있을 때 COLC 그것이 양쪽에 동일에도 불구 업데이트되는 다음 널 (null)이라고 할 때

UPDATE Temp_Table A Set T.ColZ = 'something' 
WHERE NOT EXISTS 
(SELECT * FROM Temp_Table B 
WHERE A.ColF = B.ColF 
AND ...more column comparisons 
AND ((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A')) 
    AND more column Comparisons) 
); 

업데이트가 작동합니다.

where 절에도 하위 쿼리를 사용했지만 운이 없었습니다. 하위 쿼리를 사용하는 것이 더 나은 방법일까요?

도움이나 의견을 보내 주시면 대단히 감사하겠습니다.

그 이상을 추가하고 싶다면 그 열이 null 인 경우 비교를 건너 뛰고 싶습니다. 그런 식으로하는 방법에 대한 어떤 ideass도 환영합니다. 감사

몇 행이 예를 요청할 Ypers ... 희망은 행 2 1 개 일치 위의 표 행에서

Temp_Table 
Col1 | Col2 | Col3 | Col4 |Col5 |Col6 
AB | DC | EF | GH | 08 | 
BA | CD | EF | GH | 08 | 
AB | DC | HI | NULL| 05 | 
AB | DC | JK | LM | 04 | 

충분히 분명하다 당 내 업데이트 행을 골라 가정되는 3과 4는 대응하는 행이없는 곳입니다. Col4가 Null이 아니지만 그 값이 Null 일 때 실패 할 수 있습니다. 단지 FYi temp_table에서 DC 값 Col1을 가진 Col2는 AB 값을 가지며 Col2의 CD 값은 Col1 값이 BA입니다.

UPDATE Temp_Table T SET Col6 = 'Unmatched' 
WHERE NOT EXISTS 
(SELECT * FROM Temp_Table B 
WHERE T.Col3 = B.Col3 
AND T.COl4 = B.Col4 
AND T.COl5 = B.Col5) 

희망과 감사합니다.

((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A')) 

에 :

(A.ColC = B.ColC OR A.ColC IS NULL OR B.ColC IS NULL) 

문제의 업데이트 이후 만약 내가 제대로 이해하고

+0

에 그 변경 왜'(A.ColC = B.ColC)'작동하지 않는 이유는 무엇입니까? –

+0

게시 한 내용에 명백한 오류가 없습니다. 문제는 아마 다른 곳에있을 것입니다. 작고 완전한'temp_table'과 문제를 보여주는 작고 완전한'UPDATE' 문을 게시 할 수 있습니까? – ruakh

+0

@ypercube : '존재하지 않는 곳'에 유의하십시오. 요점은 부질의 *가'Temp_Table A'의 레코드가'NULL '이라도 레코드와 일치하는'Temp_Table B '의 레코드를 찾아야하지만, OP는 그것이 작동하지 않는다고 믿어야한다는 것입니다. – ruakh

답변

2

, 당신은 변경하고 싶습니다.

이 작업을 시도 할 수 :

UPDATE Temp_Table T 
SET Col6 = 'Unmatched' 
WHERE NOT EXISTS 
(SELECT * 
    FROM Temp_Table B 
    WHERE T.Col3 = B.Col3 
    AND T.COl4 = B.Col4 
    AND T.COl5 = B.Col5 

    AND NOT ( T.Col1 = B.Col1 --- all the other columns except Col6 
      AND T.Col2 = B.Col2 
      ) 
) 
+0

답변을 주셔서 감사합니다. 불행히도이 작업을 필요한 방식으로 수행 할 수 없습니다. Ruakh은 내가이 일치가 존재하지 않는 곳이 업데이트가 일어난 곳이라고 말하면서 올바른 btw입니다. 그게 명확한 일을 돕는 지 아닌지 확실하지 않습니다. 나는 계속 노력할 것이다. 감사. – dee

+0

@dee : 몇 줄의 예제로 문제를 찾을 수 있다면 문제가 정확히 무엇인지 이해하는 데 도움이됩니다. –

+0

내 게시물에 작은 temp_table 예제를 만들었습니다 ... 분명히하는 데 도움이되는지 확실하지 않습니다. 고마워요 – dee

관련 문제