A B - - 1 2 3 1 4 5 2 6 7 8 4 9
이렇게 한테이블에 컬럼 A,B 가 있고 , A컬럼은 PK 이며 PK인 값이 B컬럼에 존재하는것만 제외하고 싶습니다.
물론 B컬럼에 값이 있는것도 제외 되어야 합니다.
그럼 결과는 나와야 하고요.
A B - - 6 7 9
제가 하는 방법은 이 테이블을 두번 읽고 하는 방법인데 한번만 읽고 처리하는 방벖은 없을까 문의 드립니다.
한번만 읽고 하는 방법은 딱히 없어보입니다만..
exists 문을 사용하여 부분범위처리로 하면 그나마 응답속도는 빨라보이는데요..
WITH A AS ( SELECT 1 AS A, NULL B FROM DUAL UNION SELECT 2 AS A, NULL B FROM DUAL UNION SELECT 3 AS A, 1 B FROM DUAL UNION SELECT 4 AS A, NULL B FROM DUAL UNION SELECT 5 AS A, 2 B FROM DUAL UNION SELECT 6 AS A, NULL B FROM DUAL UNION SELECT 7 AS A, NULL B FROM DUAL UNION SELECT 8 AS A, 4 B FROM DUAL UNION SELECT 9 AS A, NULL B FROM DUAL )
SELECT * FROM A WHERE A NOT IN ( SELECT B FROM A WHERE B IS NOT NULL) AND CASE WHEN A IS NOT NULL AND B IS NOT NULL THEN 'Y' ELSE 'N' END = 'N'
장마철님 글처럼 쿼리하시면 데이터가 많을때 상당히 느려지는 상황이 발생할수 있습니다.
WITH tableA AS (
SELECT 1 AS A, NULL B FROM DUAL UNION SELECT 2 AS A, NULL B FROM DUAL UNION SELECT 3 AS A, 1 B FROM DUAL UNION SELECT 4 AS A, NULL B FROM DUAL UNION SELECT 5 AS A, 2 B FROM DUAL UNION SELECT 6 AS A, NULL B FROM DUAL UNION SELECT 7 AS A, NULL B FROM DUAL UNION SELECT 8 AS A, 4 B FROM DUAL UNION SELECT 9 AS A, NULL B FROM DUAL )
SELECT * FROM tableA a WHERE B IS NULL
AND NOT EXISTS (SELECT 1 FROM tableA b WHERE a.A=b.B AND ROWNUM=1)
이렇게 하심 반응은 좀 빨라지겠네요
WITH t AS ( SELECT 1 a, Null b FROM dual UNION ALL SELECT 2, Null FROM dual UNION ALL SELECT 3, 1 FROM dual UNION ALL SELECT 4, Null FROM dual UNION ALL SELECT 5, 2 FROM dual UNION ALL SELECT 6, Null FROM dual UNION ALL SELECT 7, Null FROM dual UNION ALL SELECT 8, 4 FROM dual UNION ALL SELECT 9, Null FROM dual ) SELECT NVL(b, a) a FROM t GROUP BY NVL(b, a) HAVING COUNT(*) = 1 ;
오랫동안 고민하다 역시 이곳에서 답을 찾았습니다.
답변주신분들께 감사 인사 드립니다.
감사합니다.