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;