DB/MSSQL

[MSSQL] EXISTS 주의사항

울면서개발하기 2022. 6. 21. 14:21

아래와 같은 SQL 이 있었다.

DELETE 
  FROM TB_D
 WHERE EXISTS (
                SELECT 1
                  FROM TB_M B
                 WHERE B.NO = @NO
                   AND B.PK = PK
              )

의도 자체는 TB_M을 이용하여 TB_D의 특정 데이터만 삭제하길 원했던 것으로 보인다.

 

 

 

그러나 실제론 운영서버 TB_D 테이블의 모든 데이터가 삭제 되고 있었다 ㅜ_ㅜ

확인하여 보니 아래 부분이 문제가 되고 있었다.

TB_D와 TB_M간의 PK 컬럼을 비교하는 것이 아닌, TB_M과 TB_M간의 PK 컬럼을 비교하고 있었다.

DELETE 
  FROM TB_D
 WHERE EXISTS (
                SELECT 1
                  FROM TB_M B
                 WHERE B.NO = @NO
                   AND B.PK = PK  -- 비교 구문이 무조건 TRUE.
              )

 

 

 

오라클이라면 아래처럼 수정을 하면 되겠지만,

MSSQL은 아래처럼 작성하면 문법 오류가 발생한다.

(DELETE나 UPDATE 대상 테이블에 AS를 추가하면 오류가 발생하는듯)

DELETE 
  FROM TB_D A -- AS 추가
 WHERE EXISTS (
                SELECT 1
                  FROM TB_M B
                 WHERE B.NO = @NO
                   AND B.PK = A.PK
              )

 

 

 

아래처럼 수정하였다.

DELETE 
  FROM TB_D
 WHERE EXISTS (
                SELECT 1
                  FROM TB_M B
                 WHERE B.NO = @NO
                   AND B.PK = TB_D.PK -- 테이블을 명시
              )

 

 

 

'DB > MSSQL' 카테고리의 다른 글

[MSSQL] Function-Based Index  (0) 2023.07.04
[MSSQL] MAX KEEP  (0) 2022.06.30