아래와 같은 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 |