복붙노트

[SQL] 기본 키가없는 SQL 테이블에서 삭제 중복 레코드

SQL

기본 키가없는 SQL 테이블에서 삭제 중복 레코드

나는 레코드 아래로 아래 표를

create table employee
(
 EmpId number,
 EmpName varchar2(10),
 EmpSSN varchar2(11)
);

insert into employee values(1, 'Jack', '555-55-5555');
insert into employee values (2, 'Joe', '555-56-5555');
insert into employee values (3, 'Fred', '555-57-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');
insert into employee values (1, 'Jack', '555-55-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6 ,'Lisa', '555-70-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');

난 이미 내 테이블 위의 기록을 나누었다 나는이 테이블에있는 기본 키를 가지고 있겠지. 나는 EMPID과 EmpSSN 필드에 같은 값을 갖는 중복 레코드를 제거합니다.

예 : EMP를 아이디 (5)

하나의 도움 나 그 중복 레코드를 삭제하는 쿼리를 프레임 할 수

미리 감사드립니다

해결법

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

    1.기본 키를 추가 (아래 코드)

    기본 키를 추가 (아래 코드)

    올바른 삭제 (아래 코드)를 실행

    당신이 기본 키를 유지하고 싶지 않아요 왜보십시오.

    MSSQL 또는 호환 가정 :

    ALTER TABLE Employee ADD EmployeeID int identity(1,1) PRIMARY KEY;
    
    WHILE EXISTS (SELECT COUNT(*) FROM Employee GROUP BY EmpID, EmpSSN HAVING COUNT(*) > 1)
    BEGIN
        DELETE FROM Employee WHERE EmployeeID IN 
        (
            SELECT MIN(EmployeeID) as [DeleteID]
            FROM Employee
            GROUP BY EmpID, EmpSSN
            HAVING COUNT(*) > 1
        )
    END
    
  2. ==============================

    2.그것은 매우 간단합니다. 나는 SQL Server 2008의 시도

    그것은 매우 간단합니다. 나는 SQL Server 2008의 시도

    DELETE SUB FROM
    (SELECT ROW_NUMBER() OVER (PARTITION BY EmpId, EmpName, EmpSSN ORDER BY EmpId) cnt
     FROM Employee) SUB
    WHERE SUB.cnt > 1
    
  3. ==============================

    3.중복 레코드를 구분하는 행 번호를 사용합니다. 다는 EmpID / EmpSSN의 첫 번째 행 번호를 유지하고 나머지는 삭제 :

    중복 레코드를 구분하는 행 번호를 사용합니다. 다는 EmpID / EmpSSN의 첫 번째 행 번호를 유지하고 나머지는 삭제 :

        DELETE FROM Employee a
         WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
                                   FROM Employee b
                                  WHERE a.EmpID  = b.EmpID
                                    AND a.EmpSSN = b.EmpSSN )
    
  4. ==============================

    4.

    With duplicates
    
    As
    (Select *, ROW_NUMBER() Over (PARTITION by EmpID,EmpSSN Order by EmpID,EmpSSN) as Duplicate From Employee)
    
    delete From duplicates
    
    Where Duplicate > 1 ;
    

    이 표를 업데이트하고 테이블에서 모든 중복을 제거합니다!

  5. ==============================

    5.

    select distinct * into newtablename from oldtablename
    

    이제, newtablename는 중복 레코드가 없습니다.

    간단히 SQL 서버 개체 탐색기에서 F2를 눌러 테이블 이름 (newtablename)을 변경.

  6. ==============================

    6.당신은 당신의 직원 테이블의 선택 별개을 포함하는 임시 테이블 #tempemployee를 만들 수 있습니다. 그런 다음 직원으로부터 삭제합니다. 그런 다음 직원에 삽입 #tempemployee에서 선택합니다.

    당신은 당신의 직원 테이블의 선택 별개을 포함하는 임시 테이블 #tempemployee를 만들 수 있습니다. 그런 다음 직원으로부터 삭제합니다. 그런 다음 직원에 삽입 #tempemployee에서 선택합니다.

    마찬가지로 조쉬는 말했다 - 당신은 중복을 알고있다하더라도, 그것은 다른 레코드의 정확한 중복 인 경우 실제로 특정 기록을 참조 할 수 없기 때문에 그들에게 불가능합니다 삭제.

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

    7.암호

    암호

    DELETE DUP 
    FROM 
    ( 
        SELECT ROW_NUMBER() OVER (PARTITION BY Clientid ORDER BY Clientid ) AS Val 
        FROM ClientMaster 
    ) DUP 
    WHERE DUP.Val > 1
    

    설명

    당신은 고유하고자하는 열을 기준으로 분할 ROW_NUMBER ()을 기반으로 필드를 포함하는 테이블을 통해보기를 구성하는 내부 쿼리를 사용합니다.

    하나의 행 번호가없는 것을 선택이 내부 쿼리의 결과에서 삭제; 즉, 중복; 원본이 아닌.

    ROW_NUMBER 윈도우 함수 ORDER BY 절 유효한 구문 필요; 여기에 모든 열 이름을 넣을 수 있습니다. 여기에 사용하면 중복으로 처리 결과를 변경하려는 경우 (예를 들어, 등, 초기 또는 가장 최근의 유지), 다음 컬럼 (들)없이 할; 즉 당신이 유지하고자하는 레코드가 결과에 처음 올 것 같은 순서를 지정합니다.

  8. ==============================

    8.새 기본 키를 생성하지 않으려면 당신은 SQL Server의 TOP 명령을 사용할 수 있습니다 :

    새 기본 키를 생성하지 않으려면 당신은 SQL Server의 TOP 명령을 사용할 수 있습니다 :

    declare @ID int
    while EXISTS(select count(*) from Employee group by EmpId having count(*)> 1)
    begin
        select top 1 @ID = EmpId
        from Employee 
        group by EmpId
        having count(*) > 1
    
        DELETE TOP(1) FROM Employee WHERE EmpId = @ID
    end
    
  9. ==============================

    9.쿼리 아래의 쉬운 사용

    쿼리 아래의 쉬운 사용

    WITH Dups AS
    (
      SELECT col1,col2,col3,
    ROW_NUMBER() OVER(PARTITION BY col1,col2,col3 ORDER BY (SELECT 0)) AS rn
     FROM mytable
    )
    DELETE FROM Dups WHERE rn > 1
    
  10. ==============================

    10.(직원에서 ROW_NUMBER () OVER (EMPID에 의해 EMPID 순서로 파티션) CNT를 선택) 하위에서 삭제 하위 여기서 sub.cnt> 1

    (직원에서 ROW_NUMBER () OVER (EMPID에 의해 EMPID 순서로 파티션) CNT를 선택) 하위에서 삭제 하위 여기서 sub.cnt> 1

  11. ==============================

    11.나는 나와 함께 곰 그래서 SQL 전문가가 아니에요. 나는 당신이 곧 더 나은 답변을 얻을 것입니다. 다음은 중복 레코드를 찾을 수있는 방법입니다.

    나는 나와 함께 곰 그래서 SQL 전문가가 아니에요. 나는 당신이 곧 더 나은 답변을 얻을 것입니다. 다음은 중복 레코드를 찾을 수있는 방법입니다.

    select t1.empid, t1.empssn, count(*)
    from employee as t1 
    inner join employee as t2 on (t1.empid=t2.empid and t1.empssn = t2.empssn)
    group by t1.empid, t1.empssn
    having count(*) > 1
    

    당신은 중복을 차별화하는 DELETE 문에서 사용할 수있는 데이터에 아무것도 없기 때문에이를 삭제하면 더 까다로운 일이 될 것입니다. 나는 대답은 ROW_NUMBER () 또는 ID 열을 추가를 포함 할 것이다 생각한다.

  12. ==============================

    12.

    create unique clustered index Employee_idx
    on Employee ( EmpId,EmpSSN )
    with ignore_dup_key

    당신이 그것을 필요하지 않은 경우에는 인덱스를 삭제할 수 있습니다.

  13. ==============================

    13.ID 없음 없음 행 개수 () 또는 필요하지 임시 테이블 ....

    ID 없음 없음 행 개수 () 또는 필요하지 임시 테이블 ....

    WHILE 
      (
         SELECT  COUNT(*) 
         FROM TBLEMP  
         WHERE EMPNO 
                IN (SELECT empno  from tblemp group by empno having count(empno)>1)) > 1 
    
    
    DELETE top(1)  
    FROM TBLEMP 
    WHERE EMPNO IN (SELECT empno  from tblemp group by empno having count(empno)>1)
    
  14. ==============================

    14.이름이 쿼리를 사용할 수 있다는 것을 위해 이렇게 서로 다른 ID를 반복하는 테이블 ID와 이름의 두 개의 열이 있습니다 . .

    이름이 쿼리를 사용할 수 있다는 것을 위해 이렇게 서로 다른 ID를 반복하는 테이블 ID와 이름의 두 개의 열이 있습니다 . .

    DELETE FROM dbo.tbl1
    WHERE id NOT IN (
         Select MIN(Id) AS namecount FROM tbl1
         GROUP BY Name
    )
    
  15. ==============================

    15.기본 키가 정말 매우 나쁜 연습을 말할 것없이 하나 (ALTER 표)를 추가 너무 후 ... 데이터베이스 테이블을 갖는

    기본 키가 정말 매우 나쁜 연습을 말할 것없이 하나 (ALTER 표)를 추가 너무 후 ... 데이터베이스 테이블을 갖는

    당신이 (COUNT를 HAVING의 목적입니다) 더 이상 중복 기록을 볼 수 없습니다 때까지이 프로그램을 실행

    DELETE FROM [TABLE_NAME] WHERE [Id] IN 
    (
        SELECT MAX([Id])
        FROM [TABLE_NAME]
        GROUP BY [TARGET_COLUMN]
        HAVING COUNT(*) > 1
    )
    
    
    SELECT MAX([Id]),[TABLE_NAME], COUNT(*) AS dupeCount
    FROM [TABLE_NAME]
    GROUP BY [TABLE_NAME]
    HAVING COUNT(*) > 1
    

    MAX ([이드])는 의미 반대 할 경우에 최신 기록을 (사람이 처음 만든 이후에 추가) 삭제하게됩니다 것을 요구하는 첫번째 레코드를 삭제하고 MIN을 사용하십시오 삽입 된 마지막 기록을 남겨의 경우 ([ID])

  16. ==============================

    16.

    select t1.* from employee t1, employee t2 where t1.empid=t2.empid and t1.empname = t2.empname and t1.salary = t2.salary
    group by t1.empid, t1.empname,t1.salary having count(*) > 1
    
  17. ==============================

    17.

    DELETE FROM 'test' 
    USING 'test' , 'test' as vtable
    WHERE test.id>vtable.id and test.common_column=vtable.common_column  
    

    이 사용하여 우리는 중복 레코드를 제거 할 수 있습니다

  18. ==============================

    18.

    ALTER IGNORE TABLE test
               ADD UNIQUE INDEX 'test' ('b'); 
    

    @ 여기에 'B'는 고유성에 열 이름 @ 여기에 '테스트'인덱스 이름입니다.

  19. from https://stackoverflow.com/questions/985384/delete-duplicate-records-from-a-sql-table-without-a-primary-key by cc-by-sa and MIT license