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;