두개의 컬럼에 대해 중복이 있는 행들을 찾을 수 있을까요? 0 2 2,498

by 상유니 [SQL Query] [2016.03.12 19:45:47]


현재상황 :

mber_id 와 vhcle_no 2개가 primary key 인데 누가 인덱스를 삭제해버려서

중복이 생겨버려서 중복된 것들을 제거한 후 인덱스를 만들려고 합니다.

 

질문 : 

컬럼이 여러 개 있는 데 그중 두개의 컬럼값이 완전히 동일한 행들을 찾아내고 싶습니다.

그 두개의 컬럼은 mber_id 와 vhcle_no 컬럼입니다. 테이블명은 vhcle_info_tbl 입니다.

예를 들어 다른컬럼값들은 같거나 달라도 상관없는데, mber_id 가 a 이고 vhcle_no 가 1 인 행이

2개 이상 있다면 그런 mber_id 와 vhcle_no 를 select 문으로 출력하고 싶습니다.

mber_id  vhcle_no  delete_at

a            1           0

a            1           1

a           2           0

b           1           0

 

위의 예제에서 mber_id 가 a 이고 vhcle_no 가 1 인 것이 2개 있지요? 바로 그 행들의 mber_id 와 vhcle_no 를

찾아내고 싶은겁니다. 방법이 있을까요?

 

 

by 상유니 [2016.03.12 20:04:32]

자체적으로 해결했습니다.

select distinct mber_id, vhcle_no
from 
(
  select mber_id, 
  vhcle_no, 
  lag(mber_id, 1, '') over(order by mber_id, vhcle_no) mber_lag, 
  lag(vhcle_no, 1, '') over(order by mber_id, vhcle_no) vhcle_lag 
  from vhcle_info_tbl
)
where mber_id = mber_lag and vhcle_no = vhcle_lag;

 


by 창조의날개 [2016.03.14 09:24:40]

-- mber_id, vhcle_no 기준으로 중복인 데이터만 보기
select *
from (
      select *
           , ROW_NUMBER () OVER (PARTITION BY mber_id, vhcle_no ORDER BY rownum) rn
      from vhcle_info_tbl
      )
where rn = 2
;

-- mber_id, vhcle_no 기준으로 중복제거하여 하나만 보기
select *
from (
      select *
           , ROW_NUMBER () OVER (PARTITION BY mber_id, vhcle_no ORDER BY rownum) rn
      from vhcle_info_tbl
      )
where rn = 1
;

-- mber_id, vhcle_no 기준으로 중복인 데이터만 삭제하기 (1로우만 남기기)
delete vhcle_info_tbl
where rowid in (select rowid
                  from (
                        select rowid
                             , ROW_NUMBER () OVER (PARTITION BY mber_id, vhcle_no ORDER BY rownum) rn
                        from vhcle_info_tbl
                        )
                  where rn > 1
                )
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입