복붙노트

[SQL] 오라클에서 테이블에서 중복 행을 제거

SQL

오라클에서 테이블에서 중복 행을 제거

나는 오라클에서 뭔가를 테스트하고 일부 샘플 데이터로 테이블을 채워하지만, 그 과정에서 실수로 그래서 지금은 일부 열을 사용하여 기본 키를 만들 수 없습니다, 중복 레코드를로드하고 있습니다.

어떻게 그 중 하나를 모든 중복 행을 삭제하고 떠날 수 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.T1로부터 선택 별개 * 표를 작성 T2;

    T1로부터 선택 별개 * 표를 작성 T2;

  7. ==============================

    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. ==============================

    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. ==============================

    9.정말 큰 테이블에 대한 가장 빠른 방법

    정말 큰 테이블에 대한 가장 빠른 방법

  10. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    16.

    DELETE FROM tableName  WHERE ROWID NOT IN (SELECT   MIN (ROWID) FROM table GROUP BY columnname);
    
  17. ==============================

    17.

    delete from dept
    where rowid in (
         select rowid
         from dept
         minus
         select max(rowid)
         from dept
         group by DEPTNO, DNAME, LOC
    );
    
  18. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    );
    
  23. from https://stackoverflow.com/questions/529098/removing-duplicate-rows-from-table-in-oracle by cc-by-sa and MIT license