티스토리 뷰
나참 어처구니가 없는 일이 발생했다. 그 이유는 아래에서 설명 하겠다. 일단 오라클의 exists에 대해 살펴보면
가장 기본적으로
select * from A
where not exists (select * from B
where A.c1 = B.c1)
=> A가 B에 존재하지 않는 것을 조회
select * from A
where exists (select * from B
where A.c1 = B.c1)
=> A가 B에 존재하는 것을 조회
select 도 되고 exists를 이용하여 삭제도 가능 하다.
DELETE FROM EMP A
WHERE EXISTS (
SELECT 1
FROM DEPT B
WHERE A.DEPTNO = B.DEPTNO
AND B.DEPTNO = '20'
);
그 밖의 삭제 방법
DELETE FROM EMP A
WHERE A.DEPTNO = (
SELECT B.DEPTNO
FROM DEPT B
WHERE A.DEPTNO = B.DEPTNO
AND B.DEPTNO = '20'
);
DELETE FROM EMP A
WHERE (A.DEPTNO, A.ENAME) = (
SELECT B.DEPTNO, B.NAME
FROM DEPT B
WHERE B.DEPTNO = '20'
);
이런식으로 사용가능 하는데..
위에서 말한 문제는 배치가 도는데 특정 테이블 데이터가 삭제되는 것이였다. 한참을 디버깅 해보면서 찾아보니 어처구니 없게도
delete from A
where exists (select * from B
where A.c1 <> B.c1);
이런식으로 써야 되는데
delete from A
where exists (select * from A, B
where A.c1 <> B.c1);
이런식으로 썼다. 여러분, 무슨일이 일어날건지 상상이 가능 하겠습니까?
저렇게 쓰면 값이 다른게 없다면 아무일도 일어나지 않으나, 값이 다른게 1건이상 있으면 A테이블의 데이터가 모두 삭제 된다.
차이점이 이해 되시나요? 한번 테스트 해보시길..^^
개발자를 잘 뽑아야 한다... 아니다 싶으면.. 과감히..
'티베로(Tibero) 오라클(Oracle)' 카테고리의 다른 글
오라클 instr() 함수 - 경로에서 파일명만 가지고 오고 싶을때 (0) | 2017.07.20 |
---|---|
오라클 테이블 크기 변경, 컬럼 크기 변경 alter table modify (0) | 2017.07.14 |
오라클 컬럼 추가 쿼리 및 컬럼에 주석 추가 하는 방법 (0) | 2017.06.14 |
오라클 함수 (oracle function)에 권한주기 (0) | 2017.06.07 |
[오라클] sql 작성시 쿼리 순번 채번 하는 방법 (0) | 2017.05.24 |
- Total
- Today
- Yesterday
- 자바 smtp
- Python
- 포인터
- 스크래핑
- C언어
- esql
- EC
- MySQL
- 파이썬
- xe addon
- php
- ocjap
- 라이믹스 모듈
- xe애드온
- 오라클
- 파싱
- 문자열
- ocajp
- 인포믹스
- JDBC
- XE
- 프로씨
- XE3
- 이클립스
- proc
- 자바
- C
- webix
- 플러터
- KG
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |