[SQL] 오라클에서 테이블에서 중복 행을 제거
SQL오라클에서 테이블에서 중복 행을 제거
나는 오라클에서 뭔가를 테스트하고 일부 샘플 데이터로 테이블을 채워하지만, 그 과정에서 실수로 그래서 지금은 일부 열을 사용하여 기본 키를 만들 수 없습니다, 중복 레코드를로드하고 있습니다.
어떻게 그 중 하나를 모든 중복 행을 삭제하고 떠날 수 있습니까?
해결법
-
==============================
1.ROWID를 의사 열을 사용합니다.
ROWID를 의사 열을 사용합니다.
DELETE FROM your_table WHERE rowid not in (SELECT MIN(rowid) FROM your_table GROUP BY column1, column2, column3);
경우 1 열, 2 열 및 3 열 각 레코드에 대한 식별 키를 구성합니다. 당신은 모든 열을 나열 할 수 있습니다.
-
==============================
2.톰 질문에서
톰 질문에서
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);
(누락 괄호 고정)
-
==============================
3.DevX.com에서 :
DevX.com에서 :
DELETE FROM our_table WHERE rowid not in (SELECT MIN(rowid) FROM our_table GROUP BY column1, column2, column3...) ;
등 1 열, 2 열은 사용하고자하는 키입니다.
-
==============================
4.
DELETE FROM tablename a WHERE a.ROWID > ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2)
-
==============================
5.
delete from emp where rowid not in (select max(rowid) from emp group by empno);
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 );
delete from emp e1 where rowid not in (select max(rowid) from emp e2 where e1.empno = e2.empno );
-
==============================
6.T1로부터 선택 별개 * 표를 작성 T2;
T1로부터 선택 별개 * 표를 작성 T2;
-
==============================
7.당신은 루프 커서를 사용하여 작은 PL / SQL 블록을하고 유지하려는하지 않는 행을 삭제해야합니다. 예를 들어 :
당신은 루프 커서를 사용하여 작은 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;
-
==============================
8.중복을 선택하기 만 쿼리 형식이 될 수 있습니다 :
중복을 선택하기 만 쿼리 형식이 될 수 있습니다 :
SELECT GroupFunction(column1), GroupFunction(column2),..., COUNT(column1), column1, column2... FROM our_table GROUP BY column1, column2, column3... HAVING COUNT(column1) > 1
다른 제안이 따라 올바른 쿼리 그래서 :
DELETE FROM tablename a WHERE a.ROWID > ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....so on.. to identify the duplicate rows....)
이 쿼리는 WHERE 절에서 선택한 기준에 대한 데이터베이스에서 가장 오래된 기록을 유지합니다.
오라클 공인 준 학사 (2008)
-
==============================
9.정말 큰 테이블에 대한 가장 빠른 방법
정말 큰 테이블에 대한 가장 빠른 방법
-
==============================
10.rowid- 사용
rowid- 사용
delete from emp where rowid not in (select max(rowid) from emp group by empno);
자기 join- 사용
delete from emp e1 where rowid not in (select max(rowid) from emp e2 where e1.empno = e2.empno );
-
==============================
11.
delete from emp where rowid in ( select rid from ( select rowid rid, dense_rank() over(partition by empno order by rowid ) rn from emp ) where rn > 1 );
-
==============================
12.1. 솔루션
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.solution
delete from emp e1 where rowid not in (select max(rowid) from emp e2 where e1.empno = e2.empno );
4. 솔루션
delete from emp where rowid in ( select rid from ( select rowid rid, dense_rank() over(partition by empno order by rowid ) rn from emp ) where rn > 1 );
-
==============================
13.5. 솔루션
5. 솔루션
delete from emp where rowid in ( select rid from ( select rowid rid,rank() over (partition by emp_id order by rowid)rn from emp ) where rn > 1 );
-
==============================
14.
DELETE from table_name where rowid not in (select min(rowid) FROM table_name group by column_name);
당신은 또한 다른 방법으로 중복 레코드를 삭제할 수 있습니다
DELETE from table_name a where rowid > (select min(rowid) FROM table_name b where a.column=b.column);
-
==============================
15.
create table abcd(id number(10),name varchar2(20)) insert into abcd values(1,'abc') insert into abcd values(2,'pqr') insert into abcd values(3,'xyz') insert into abcd values(1,'abc') insert into abcd values(2,'pqr') insert into abcd values(3,'xyz') select * from abcd id Name 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Delete Duplicate record but keep Distinct Record in table DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id ); run the above query 3 rows delete select * from abcd id Name 1 abc 2 pqr 3 xyz
-
==============================
16.
DELETE FROM tableName WHERE ROWID NOT IN (SELECT MIN (ROWID) FROM table GROUP BY columnname);
-
==============================
17.
delete from dept where rowid in ( select rowid from dept minus select max(rowid) from dept group by DEPTNO, DNAME, LOC );
-
==============================
18.최상의 성능을 위해, 여기에 내가 쓴 것입니다 : (실시 계획 참조)
최상의 성능을 위해, 여기에 내가 쓴 것입니다 : (실시 계획 참조)
DELETE FROM your_table WHERE rowid IN (select t1.rowid from your_table t1 LEFT OUTER JOIN ( SELECT MIN(rowid) as rowid, column1,column2, column3 FROM your_table GROUP BY column1, column2, column3 ) co1 ON (t1.rowid = co1.rowid) WHERE co1.rowid IS NULL );
-
==============================
19.스크립트 아래 확인 -
스크립트 아래 확인 -
1.
Create table test(id int,sal int);
2.
insert into test values(1,100); insert into test values(1,100); insert into test values(2,200); insert into test values(2,200); insert into test values(3,300); insert into test values(3,300); commit;
3.
select * from test;
현재 6 기록을 볼 수 있습니다. 쿼리 아래 4.run -
delete from test where rowid in (select rowid from (select rowid, row_number() over (partition by id order by sal) dup from test) where dup > 1)
당신은 중복 레코드가 삭제 된 것을 볼 수 있습니다. 이 쿼리를 해결 바랍니다. 감사 :)
-
==============================
20.나는 공통 테이블 표현식 및 창 기능을 사용하는 모든 답변을 보지 않았다. 이것은 내가 함께 작동하도록 쉬운 찾을 것입니다.
나는 공통 테이블 표현식 및 창 기능을 사용하는 모든 답변을 보지 않았다. 이것은 내가 함께 작동하도록 쉬운 찾을 것입니다.
DELETE FROM YourTable WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID, ROW_NUMBER() OVER( PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER( PARTITION BY First_Name, Last_Name, Birth_Date ORDER BY ROWID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM duplicates WHERE RN > 1);
참고 일도 :
1) 우리는 파티션 절에서 필드에 중복을 검사한다.
2)) 한 당신이 (ROW_NUMBER있을 것이다 해당 행을 만들기 위해 order by 절을 사용하여 다른 사람을 통해 중복 선택하는 몇 가지 이유가있는 경우 1 =
3) 당신은에 where 절 마지막을 변경하여 보존 숫자의 중복을 변경할 수 있습니다 "어디 RN> N 'N은> = 1 (I은 N = 0 중복이있는 모든 행을 삭제 것이라고 생각했지만, 그냥 모든 행을 삭제 것 포함) .
4) 합계 파티션 필드를 그룹의 행 번호와 함께 각 행에 태그 할 CTE 쿼리를 추가했습니다. 그래서 첫 번째 항목 사용 "CNT> 1"을 포함하여, 중복으로 행을 선택합니다.
-
==============================
21.
create or replace procedure delete_duplicate_enq as cursor c1 is select * from enquiry; begin for z in c1 loop delete enquiry where enquiry.enquiryno = z.enquiryno and rowid > any (select rowid from enquiry where enquiry.enquiryno = z.enquiryno); end loop; end delete_duplicate_enq;
-
==============================
22.해결책 :
해결책 :
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 );
from https://stackoverflow.com/questions/529098/removing-duplicate-rows-from-table-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL의 쿼리에 변수를 선언하는 방법 (0) | 2020.03.14 |
---|---|
[SQL] SQL Server의 LIMIT 10 ... 20 (0) | 2020.03.14 |
[SQL] SQL 쿼리는 두 날짜 사이의 날짜를 선택합니다 (0) | 2020.03.14 |
[SQL] SQL에서 인덱스는 무엇입니까? (0) | 2020.03.14 |
[SQL] 어떻게 ATTACH로 열린 SQLite 데이터베이스 파일에 테이블을 나열하려면? (0) | 2020.03.13 |