A 테이블의 데이터가 100만행과 컬럼 A,B,C,D,E를 가지고 있으며
B 테이블의 데이터가 5000개의 행과 컬럼 A,B,C,D,E,F을 가지고 있습니다.
A테이블의 데이터를 삭제할 것인데
A와 B테이블의 각 행을 매칭해서 A,B컬럼이 동일하면서 C컬럼이 없는 대상을 삭제하려고 합니다.
A테이블의 A,B,C 컬럼은 각각 인덱스 설정되어 있습니다. B테이블의 경우 A,B,C컬럼으로 그룹핑하면 고유값은 100행 미만입니다.
예를 들어
A테이블의 값이
A / A / A
A / A / B - 삭제대상
A / A / C - 삭제대상
A / A / D
B / B / B
B테이블의 값이
A / A / A
A / A / D
B / B / B
이렇게 있다면
A와 A가 동일하지만 A, A가 동일하면서 3번쨰 컬럼이 B와 C는 B테이블에 없기 때문에 삭제하고자 합니다.
ChatGPT를 통해 얻은 쿼리는 아래와 같습니다.
DELETE A
FROM A
WHERE EXISTS (
SELECT *
FROM B
WHERE A.B = B.H AND A.C = B.I
) AND NOT EXISTS (
SELECT * FROM B WHERE A.D = B.J AND A.E = B.K
);
다만 첫번째 exsts조건에서 A/A, B/B컬럼일치하는 대상에서 3번쨰 컬럼의 ABC로 조건이 먹히다보니....
A/A/B 대상은 삭제가 되지 않습니다...ㅠ
이런 조건은 어떻게 걸어야 할까요?ㅠ
저렇게 답변을 주면 다시 달라고 하세요.
"그러면 A/A/B 는 삭제할수가 없잖아. 다시 알려줘"
DELTE FROM
table1
FROM
table1
INNER JOIN
table2
ON
table1.A = table2.B AND table1.B = table2.B AND table1.C <> table2.C
혹은
DELTE t1
FROM
table1 AS t1
INNER JOIN
table2 AS t2
ON
t1.A = t2.B AND t1.B = t2.B AND t1.C <> t2.C
요렇게 하면 되지 않나요. 돌려보진 않았습니다만, 될 것 같네요. join 을 걸어야 해서 효율은 낮을 수 있지만요 ㄷㄷㄷ
저는 본문을 읽고 t1.A = t2.A && t1.B = t2.B && t1.C != t2.C 라고 생각하고 조건문을 썼습니다. 그게 아닌가 보죠?
join 에 대한 조건문이니, 원하는 조건문을 적절히 넣으면 해결되지 않을까 합니다.
-- select A1.pk from A as A1 right outer join B on ( A1.A = B.A and A1.B = B.B ) where B.C is NULL 만 실행해서 확인 해 보세요.