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)
문제의 업데이트 이후 만약 내가 제대로 이해하고
에 그 변경 왜'(A.ColC = B.ColC)'작동하지 않는 이유는 무엇입니까? –
게시 한 내용에 명백한 오류가 없습니다. 문제는 아마 다른 곳에있을 것입니다. 작고 완전한'temp_table'과 문제를 보여주는 작고 완전한'UPDATE' 문을 게시 할 수 있습니까? – ruakh
@ypercube : '존재하지 않는 곳'에 유의하십시오. 요점은 부질의 *가'Temp_Table A'의 레코드가'NULL '이라도 레코드와 일치하는'Temp_Table B '의 레코드를 찾아야하지만, OP는 그것이 작동하지 않는다고 믿어야한다는 것입니다. – ruakh