[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.기본 키를 추가 (아래 코드)
기본 키를 추가 (아래 코드)
올바른 삭제 (아래 코드)를 실행
당신이 기본 키를 유지하고 싶지 않아요 왜보십시오.
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.그것은 매우 간단합니다. 나는 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.중복 레코드를 구분하는 행 번호를 사용합니다. 다는 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.
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.
select distinct * into newtablename from oldtablename
이제, newtablename는 중복 레코드가 없습니다.
간단히 SQL 서버 개체 탐색기에서 F2를 눌러 테이블 이름 (newtablename)을 변경.
-
==============================
6.당신은 당신의 직원 테이블의 선택 별개을 포함하는 임시 테이블 #tempemployee를 만들 수 있습니다. 그런 다음 직원으로부터 삭제합니다. 그런 다음 직원에 삽입 #tempemployee에서 선택합니다.
당신은 당신의 직원 테이블의 선택 별개을 포함하는 임시 테이블 #tempemployee를 만들 수 있습니다. 그런 다음 직원으로부터 삭제합니다. 그런 다음 직원에 삽입 #tempemployee에서 선택합니다.
마찬가지로 조쉬는 말했다 - 당신은 중복을 알고있다하더라도, 그것은 다른 레코드의 정확한 중복 인 경우 실제로 특정 기록을 참조 할 수 없기 때문에 그들에게 불가능합니다 삭제.
-
==============================
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.새 기본 키를 생성하지 않으려면 당신은 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.쿼리 아래의 쉬운 사용
쿼리 아래의 쉬운 사용
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.(직원에서 ROW_NUMBER () OVER (EMPID에 의해 EMPID 순서로 파티션) CNT를 선택) 하위에서 삭제 하위 여기서 sub.cnt> 1
(직원에서 ROW_NUMBER () OVER (EMPID에 의해 EMPID 순서로 파티션) CNT를 선택) 하위에서 삭제 하위 여기서 sub.cnt> 1
-
==============================
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.
create unique clustered index Employee_idx on Employee ( EmpId,EmpSSN ) with ignore_dup_key
당신이 그것을 필요하지 않은 경우에는 인덱스를 삭제할 수 있습니다.
-
==============================
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.이름이 쿼리를 사용할 수 있다는 것을 위해 이렇게 서로 다른 ID를 반복하는 테이블 ID와 이름의 두 개의 열이 있습니다 . .
이름이 쿼리를 사용할 수 있다는 것을 위해 이렇게 서로 다른 ID를 반복하는 테이블 ID와 이름의 두 개의 열이 있습니다 . .
DELETE FROM dbo.tbl1 WHERE id NOT IN ( Select MIN(Id) AS namecount FROM tbl1 GROUP BY Name )
-
==============================
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.
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.
DELETE FROM 'test' USING 'test' , 'test' as vtable WHERE test.id>vtable.id and test.common_column=vtable.common_column
이 사용하여 우리는 중복 레코드를 제거 할 수 있습니다
-
==============================
18.
ALTER IGNORE TABLE test ADD UNIQUE INDEX 'test' ('b');
@ 여기에 'B'는 고유성에 열 이름 @ 여기에 '테스트'인덱스 이름입니다.
from https://stackoverflow.com/questions/985384/delete-duplicate-records-from-a-sql-table-without-a-primary-key by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL Server의 가입과 UPDATE 문을 할 수 있습니까? (0) | 2020.04.13 |
---|---|
[SQL] 서로 데이터를 하나 개의 테이블을 업데이트 (0) | 2020.04.13 |
[SQL] MySQL의 업데이트 쿼리의 증가 값 (0) | 2020.04.13 |
[SQL] SQL 서버는 어디 식 케이스를 무시 (0) | 2020.04.13 |
[SQL] 어떻게 SQL 서버에서 동시에 두 테이블에 데이터를 삽입 할 수 있습니까? (0) | 2020.04.13 |