[sql] Oracle의 테이블에서 중복 행 제거

Oracle에서 무언가를 테스트하고 샘플 데이터로 테이블을 채웠지만 실수로 중복 레코드를로드했기 때문에 일부 열을 사용하여 기본 키를 만들 수 없습니다.

모든 중복 행을 삭제하고 그중 하나만 남겨 둘 수 있습니까?



답변

rowid의사 열을 사용하십시오 .

DELETE FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2, column3);

어디에서 column1, column2그리고 column3각 레코드에 대한 식별 키를 구성합니다. 모든 열을 나열 할 수 있습니다.


답변

에서 톰 질문

delete from t
 where rowid IN ( select rid
                    from (select rowid rid,
                                 row_number() over (partition by
                         companyid, agentid, class , status, terminationdate
                                   order by rowid) rn
                            from t)
                   where rn <> 1);

(없는 괄호를 수정)


답변

에서 DevX.com :

DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3...) ;

column1, column2 등이 사용하려는 키입니다.


답변

DELETE FROM tablename a
      WHERE a.ROWID > ANY (SELECT b.ROWID
                             FROM tablename b
                            WHERE a.fieldname = b.fieldname
                              AND a.fieldname2 = b.fieldname2)


답변

해결책 1)

delete from emp
where rowid not in
(select max(rowid) from emp group by empno);

해결책 2)

delete from emp where rowid in
               (
                 select rid from
                  (
                    select rowid rid,
                      row_number() over(partition by empno order by empno) rn
                      from emp
                  )
                where rn > 1
               );

해결책 3)

delete from emp e1
         where rowid not in
          (select max(rowid) from emp e2
           where e1.empno = e2.empno ); 


답변

t1과 구별되는 선택으로 테이블 t2를 작성하십시오.


답변

커서 for 루프를 사용하여 작은 pl / sql 블록을 수행하고 유지하지 않으려는 행을 삭제해야합니다. 예를 들어 :

declare
prev_var my_table.var1%TYPE;

begin

for t in (select var1 from my_table order by var 1) LOOP

-- if previous var equal current var, delete the row, else keep on going.
end loop;

end;