내용 : 두개의 컬럼이 동시 중복되는 레코드를 찾아서 하나만 남기고 모두 삭제하기
drop table mydb_tbl
create table mydb_tbl
( idx int identity not null
, code char(1) not null
, name varchar(10) not null
)
insert into mydb_tbl (code, name) values('A', '홍길동')
insert into mydb_tbl (code, name) values('B', '홍길동')
insert into mydb_tbl (code, name) values('C', '홍길동')
insert into mydb_tbl (code, name) values('A', '이순신')
insert into mydb_tbl (code, name) values('C', '이상아')
insert into mydb_tbl (code, name) values('B', '홍길동')
insert into mydb_tbl (code, name) values('A', '홍길동')
insert into mydb_tbl (code, name) values('C', '이상아')
--입력되어 있는 자료 확인
select idx, code, name from mydb_tbl
order by code, name
idx code name
----------- ---- ----------
4 A 이순신
1 A 홍길동
7 A 홍길동
6 B 홍길동
2 B 홍길동
5 C 이상아
8 C 이상아
3 C 홍길동
(8 row(s) affected)
--셀프조인으로 확인해보면
select * from mydb_tbl a, mydb_tbl b
where a.code = b.code and a.name = b.name
order by a.code, a.name
idx code name idx code name
----------- ---- ---------- ----------- ---- ----------
4 A 이순신 4 A 이순신
1 A 홍길동 1 A 홍길동
7 A 홍길동 1 A 홍길동
1 A 홍길동 7 A 홍길동
7 A 홍길동 7 A 홍길동
2 B 홍길동 6 B 홍길동
6 B 홍길동 6 B 홍길동
2 B 홍길동 2 B 홍길동
6 B 홍길동 2 B 홍길동
5 C 이상아 5 C 이상아
8 C 이상아 5 C 이상아
5 C 이상아 8 C 이상아
8 C 이상아 8 C 이상아
3 C 홍길동 3 C 홍길동
(14 row(s) affected)
-- 중복되는 데이타로 삭제되어야 할 데이타들
select * from mydb_tbl a, mydb_tbl b
where a.code = b.code and a.name = b.name and a.idx < b.idx
order by a.code, a.name
idx code name idx code name
----------- ---- ---------- ----------- ---- ----------
1 A 홍길동 7 A 홍길동
2 B 홍길동 6 B 홍길동
5 C 이상아 8 C 이상아
(3 row(s) affected)
-- 요고 한문장 이면 된다.
delete from mydb_tbl
where idx in (select a.idx from mydb_tbl a, mydb_tbl b
where a.code = b.code and a.name = b.name and a.idx < b.idx )
--결과 확인
select idx, code, name from mydb_tbl
order by code, name
idx code name
----------- ---- ----------
4 A 이순신
7 A 홍길동
6 B 홍길동
8 C 이상아
3 C 홍길동
(5 row(s) affected)