강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

중복되는 행(row) 검출

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

중복되는 행(row) 검출

t.gif
t.gif
중복행을 가지는 레코드를 찾는 것에 대한 많은 질의들이 존재한다.
예상한 결과를 얻게 해주는 질의는 많지만, 성능이 좋지 않은 질의 또한 많다.
아래의 예에서는 동일한 이름을 가지는 사람을 찾는 예제를 보이지만 모든 필드에 대해 완전히 동일한 레코드를 찾는다면 이름대신 ID와 같은 컬럼을 사용하면 될 것이다.

우리는 회원테이블(member)에 대해 동명이인을 찾아 볼 것이다.
우선 같은 이름을 가지는 회원에 대한 카운트를 구하고 카운트가 높은 순으로 정렬하자

명규@DBAKORA> SET TIMING ON

명규@DBAKORA> select mem_name, count(mem_name) from member
  2  group by mem_name having count(mem_name) > 1 order by count(mem_name) desc;

MEM_NAME             COUNT(MEM_NAME)
-------------------- ---------------
김수진                            28
김은정                            26
김지혜                            24
김민정                            23

이하 생략..

이제 동명이인수 말고 동명이인의 레코드를 뽑아보자

명규@DBAKORA> select mem_name, mem_reg_day from member
  2  where
  3  mem_name in
  4  (
  5  select mem_name from member
  6  group by mem_name having count(mem_name) > 1
  7  ) group by mem_name;

MEM_NAME             MEM_REG_D
-------------------- ---------
강경은               23-FEB-02
강경은               23-JAN-02
강도연               08-JAN-02
강도연               22-FEB-02
강명화               14-FEB-02
강명화               29-JAN-02

이하생략...

중복행제거 방법은 위에서 rowid를 함께 select한후, 남겨둘 row를 결정하고 나머지 row들에 대한 rowid만 추려내면 된다. 중복행제거의 경우, 자동으로 하지 않는 것이 좋다. 우선 제거할 중복된 row들을 파악한 후, 수동으로 해주는 것이 안전성면에서 바람직할 것이다. 이러한 방법은 오라클의 exception테이블을 활용하는 것이 좋을 것이다.

제약조건을 add시 unique제약조건으로 exception처리하면 원하는 결과를 얻을 수 있을 것이다.

This article comes from dbakorea.pe.kr (Leave this line as is)

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,810 개
  • 현재 접속자 :  116 명