SAP BASIC

[11] ABAP OPEN SQL - WHERE EXISTS, WHERE NOT EXISTS

0v0_삐약 2024. 8. 23. 10:52
728x90

개발 중 exists와 not exists 를 사용했는데, 예상과 다르게 데이터가 출력되어 

두 구문에 대해 작성해본다! 


1. WHERE NOT EXSITS 

SELECT *
  FROM scarr
 WHERE CARRID IN ( 'AA', 'AB', 'AC', 'AD' )
  INTO TABLE @DATA(lt_itab).

SELECT a~*
  FROM scarr AS a INNER JOIN @lt_itab AS b ON a~CARRID = b~CARRID
  WHERE NOT EXISTS (   SELECT *
                         FROM scarr
                        WHERE CARRID EQ 'CO' )
  INTO TABLE @DATA(lt_scarr).

SCARR에서 CARRID 가 'AA', 'AB', 'AC', 'AD인 것을 출력했다

 

예상 결과 : CARRID 가 AA, AB, AC, AD인 것 중에서 (sub query) Carrid 가 CO가 아닌 것을 출력!
=> AA, AB, AC, AD가 나오겠지? 

 

실제 결과 : 아무것도 안나옴...

 

이유? 

WHERE NOT EXISTS 의 의미! 

- WHERE NOT EXISTS 쿼리의 반환값이 존재한다면 ? FALSE( select X), 존재하지 않으면 TRUE (select)

=> 서브쿼리의 반환값이 존재하냐 존재하지 않냐로 TRUE / FALSE 결과가 나오고, 그에 따라 셀렉트 하냐 마냐가 결정됨

NOT IN 의 의미가 아니다 ㅎㅎㅎ

테스트:  CARRID = 'KKK' (존재하지 않는 값)으로 테스트 

SELECT a~*
  FROM scarr AS a INNER JOIN @lt_itab AS b ON a~CARRID = b~CARRID
  WHERE NOT EXISTS (   SELECT *
                         FROM scarr
                        WHERE CARRID EQ 'KKK' )
  INTO TABLE @DATA(lt_scarr).

 

결과 : 서브쿼리의 결과가 존재하지 않기 때문에 TRUE => Select 한다! 


 

2. WHERE EXISTS 

- WHERE NOT EXISTS와 반대로,

쿼리의 반환값이 존재한다면 ? TRUE( select ), 존재하지 않으면 FALSE (select X )

SELECT a~*
  FROM scarr AS a INNER JOIN @lt_itab AS b ON a~CARRID = b~CARRID
  WHERE EXISTS (   SELECT *
                     FROM scarr
                    WHERE CARRID EQ 'KKK' )
  INTO TABLE @DATA(lt_scarr).

KKK인 CARRID가 존재하지 않음 => FALSE => SELECT X 

 

결과 :

728x90