본문 바로가기

[ORACLE] EXISTS, NOT EXISTS

I'm 영서 2022. 4. 7.
반응형

오라클을 사용하며 

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 사용시 

똑같은 결과가 나온다..! 

반응형

댓글