[ORACLE] EXISTS, NOT EXISTS
반응형
오라클을 사용하며
A 테이블에 있는 데이터를 조회할때,
B 테이블에도 기준 데이터가 있는지를 확인하는 경우가 있다.
이때 EXISTS 구문을 사용하면 쉽게 해결 가능하다.
구문의 일반적인 구조는 이러하다.
SELECT *
FROM /*검색할 테이블 A*/
WHERE /*A.PK*/
AND EXISTS (SELECT 'X'
FROM /*데이터가 존재하는지 확인할 테이블 B*/
)
간단한 구문을 작성하자면 아래와 같은데 이렇게 두 테이블을 JOIN 하는 것과 같은 결과를 얻어낼 수 있다..
WITH W_TYPE AS
(
SELECT 'B' AS TYPE_CODE,'BOOL' AS TYPE_NAME, '1' AS TYPE_SIZE FROM DUAL
UNION
SELECT 'I' , 'INTEGER', '4' FROM DUAL
UNION
SELECT 'F' ,'FLOAT' , '4' FROM DUAL
UNION
SELECT 'D' ,'DOUBLE', '8' FROM DUAL
),
W_ALLTYPE_NAME AS
(
SELECT 'BOOL' AS TYPE_NAME FROM DUAL
UNION ALL
SELECT 'CHAR' AS TYPE_NAME FROM DUAL
UNION ALL
SELECT 'SHORT' AS TYPE_NAME FROM DUAL
UNION ALL
SELECT 'INTEGER' AS TYPE_NAME FROM DUAL
UNION ALL
SELECT 'FLOAT' AS TYPE_NAME FROM DUAL
UNION ALL
SELECT 'DOUBLE' AS TYPE_NAME FROM DUAL
UNION ALL
SELECT 'STRING' AS TYPE_NAME FROM DUAL
)
/*
-- A 기준으로 Z 테이블에 없는것만 조회
SELECT *
FROM W_ALLTYPE_NAME A
WHERE NOT EXISTS (SELECT 'X'
FROM W_TYPE Z
WHERE Z.TYPE_NAME = A.TYPE_NAME)
*/
/*
-- A 기준으로 Z 테이블에 있는것만 조회
SELECT *
FROM W_ALLTYPE_NAME A
WHERE EXISTS (SELECT 'X'
FROM W_TYPE Z
WHERE Z.TYPE_NAME = A.TYPE_NAME)
*/
EXISTS문의 존재 의의라고 생각하는 부분은 아래와 같다.
SELECT *
FROM W_ALLTYPE_NAME A
WHERE NOT EXISTS (SELECT 'X'
FROM W_TYPE Z
WHERE Z.TYPE_NAME = A.TYPE_NAME
AND Z.TYPE_SIZE = '4' )
Z테이블에서 타입 사이즈가 4인것들만 조회를 한 후 A테이블과 존재 여부를 확인하는 SQL로 사용하면 Z테이블에 있는 데이터를 검색함과 동시에 A테이블을 조회할 수 있다.
* JOIN을 사용해서도 동일한 결과를 얻을 수 있다.
SELECT *
FROM W_ALLTYPE_NAME A, W_TYPE Z
WHERE A.TYPE_NAME = Z.TYPE_NAME
;
SELECT *
FROM W_ALLTYPE_NAME A, W_TYPE Z
WHERE A.TYPE_NAME = Z.TYPE_NAME (+)
;
SELECT A.TYPE_NAME
FROM W_ALLTYPE_NAME A, W_TYPE Z
WHERE A.TYPE_NAME = Z.TYPE_NAME (+)
AND Z.TYPE_NAME IS NULL
OUTER JOIN 사용시
똑같은 결과가 나온다..!
반응형
'Study > Oracle' 카테고리의 다른 글
[ORACLE] 오라클 클라우드 자바접속 (VS CODE) (0) | 2022.04.14 |
---|---|
[ORACLE] DROP, DELETE, UPDATE등 원복 (TIMESTAMP, FLASHBACK) (0) | 2022.04.12 |
[ORACLE] JOIN 종류와 사용법 (0) | 2022.04.08 |
[ORACLE] MERGE INTO 구문 (0) | 2021.06.25 |
[ORACLE] 컬럼 관련 쿼리 (0) | 2021.04.19 |
댓글