[SQL] SQL 테이블에서 중복 값 찾기
SQLSQL 테이블에서 중복 값 찾기
그것은 하나 개의 필드에 중복을 쉽게 찾을 수 있습니다 :
SELECT name, COUNT(email)
FROM users
GROUP BY email
HAVING COUNT(email) > 1
우리는 테이블 그래서 만약
ID NAME EMAIL
1 John asd@asd.com
2 Sam asd@asd.com
3 Tom asd@asd.com
4 Bob bob@asd.com
5 Tom asd@asd.com
그들은 모두 같은 이메일을 가지고 있기 때문에이 쿼리는 우리 존, 샘, 톰, 톰를 줄 것이다.
그러나, 내가 원하는 동일한 이메일과 이름이 중복을 얻는 것입니다.
즉, 내가 "톰", "톰"싶어.
나는이 필요한 이유는 : 나는 실수를하고, 중복 된 이름과 이메일 값을 삽입 할 수 있었다. 내가 먼저 그들을 찾아 낼 필요가 그래서 지금은, / 제거 중복을 변경해야합니다.
해결법
-
==============================
1.
SELECT name, email, COUNT(*) FROM users GROUP BY name, email HAVING COUNT(*) > 1
열 모두에서 간단하게 그룹.
참고 : 기존의 ANSI 표준은 GROUP BY의 모든 비 집계 열을 가지고있다 그러나 이것은 "기능 종속성"의 아이디어로 변경되었습니다
지원 일치하지 않습니다 :
-
==============================
2.이 시도:
이 시도:
declare @YourTable table (id int, name varchar(10), email varchar(50)) INSERT @YourTable VALUES (1,'John','John-email') INSERT @YourTable VALUES (2,'John','John-email') INSERT @YourTable VALUES (3,'fred','John-email') INSERT @YourTable VALUES (4,'fred','fred-email') INSERT @YourTable VALUES (5,'sam','sam-email') INSERT @YourTable VALUES (6,'sam','sam-email') SELECT name,email, COUNT(*) AS CountOf FROM @YourTable GROUP BY name,email HAVING COUNT(*)>1
산출:
name email CountOf ---------- ----------- ----------- John John-email 2 sam sam-email 2 (2 row(s) affected)
당신이 원하는 경우 DUPS의 ID는 이것을 사용 :
SELECT y.id,y.name,y.email FROM @YourTable y INNER JOIN (SELECT name,email, COUNT(*) AS CountOf FROM @YourTable GROUP BY name,email HAVING COUNT(*)>1 ) dt ON y.name=dt.name AND y.email=dt.email
산출:
id name email ----------- ---------- ------------ 1 John John-email 2 John John-email 5 sam sam-email 6 sam sam-email (4 row(s) affected)
삭제 중복 시도 :
DELETE d FROM @YourTable d INNER JOIN (SELECT y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank FROM @YourTable y INNER JOIN (SELECT name,email, COUNT(*) AS CountOf FROM @YourTable GROUP BY name,email HAVING COUNT(*)>1 ) dt ON y.name=dt.name AND y.email=dt.email ) dt2 ON d.id=dt2.id WHERE dt2.RowRank!=1 SELECT * FROM @YourTable
산출:
id name email ----------- ---------- -------------- 1 John John-email 3 fred John-email 4 fred fred-email 5 sam sam-email (4 row(s) affected)
-
==============================
3.이 시도:
이 시도:
SELECT name, email FROM users GROUP BY name, email HAVING ( COUNT(*) > 1 )
-
==============================
4.당신은 중복을 삭제하려면, 여기에 트리플로 짝수 / 홀수 행을 발견하는 것보다 그것을 할 수있는 훨씬 간단한 방법 서브 - 선택 :
당신은 중복을 삭제하려면, 여기에 트리플로 짝수 / 홀수 행을 발견하는 것보다 그것을 할 수있는 훨씬 간단한 방법 서브 - 선택 :
SELECT id, name, email FROM users u, users u2 WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
그래서 삭제합니다 :
DELETE FROM users WHERE id IN ( SELECT id/*, name, email*/ FROM users u, users u2 WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id )
훨씬 더 쉽게 읽고 이럴을 이해하기
참고 : 유일한 문제는 당신이 행이 삭제되지있을 때까지 당신이 때마다 중복 단지 1 각의를 삭제하기 때문에 요청을 실행해야한다는 것입니다
-
==============================
5.다음을 시도해보십시오
다음을 시도해보십시오
SELECT * FROM ( SELECT Id, Name, Age, Comments, Row_Number() OVER(PARTITION BY Name, Age ORDER By Name) AS Rank FROM Customers ) AS B WHERE Rank>1
-
==============================
6.
SELECT name, email FROM users WHERE email in (SELECT email FROM users GROUP BY email HAVING COUNT(*)>1)
-
==============================
7.조금 늦게 파티에 그러나 나는 모든 중복 ID를 찾는 데 정말 멋진 해결 방법을 찾을 수 :
조금 늦게 파티에 그러나 나는 모든 중복 ID를 찾는 데 정말 멋진 해결 방법을 찾을 수 :
SELECT GROUP_CONCAT( id ) FROM users GROUP BY email HAVING ( COUNT(email) > 1 )
-
==============================
8.이 코드를 시도
이 코드를 시도
WITH CTE AS ( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn) FROM ccnmaster ) select * from CTE
-
==============================
9.이 선택은 / 중복의 각 그룹에서 하나 개의 레코드를 제외한 모든 중복 레코드를 삭제합니다. 따라서, 삭제 잎 중복의 각 그룹의 모든 고유 기록 + 하나 개의 기록.
이 선택은 / 중복의 각 그룹에서 하나 개의 레코드를 제외한 모든 중복 레코드를 삭제합니다. 따라서, 삭제 잎 중복의 각 그룹의 모든 고유 기록 + 하나 개의 기록.
선택 중복 :
SELECT * FROM table WHERE id NOT IN ( SELECT MIN(id) FROM table GROUP BY column1, column2 );
삭제 중복 :
DELETE FROM table WHERE id NOT IN ( SELECT MIN(id) FROM table GROUP BY column1, column2 );
기록의 더 많은 양의주의, 그것은 성능 문제가 발생할 수 있습니다.
-
==============================
10.오라클 작업의 경우이 방법이 바람직 할 것입니다 :
오라클 작업의 경우이 방법이 바람직 할 것입니다 :
create table my_users(id number, name varchar2(100), email varchar2(100)); insert into my_users values (1, 'John', 'asd@asd.com'); insert into my_users values (2, 'Sam', 'asd@asd.com'); insert into my_users values (3, 'Tom', 'asd@asd.com'); insert into my_users values (4, 'Bob', 'bob@asd.com'); insert into my_users values (5, 'Tom', 'asd@asd.com'); commit; select * from my_users where rowid not in (select min(rowid) from my_users group by name, email);
-
==============================
11.
select name, email , case when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes' else 'No' end "duplicated ?" from users
-
==============================
12.당신이 당신의 테이블에 중복 행이 있는지 확인하고자하는 경우에, 나는 쿼리 아래 사용 :
당신이 당신의 테이블에 중복 행이 있는지 확인하고자하는 경우에, 나는 쿼리 아래 사용 :
create table my_table(id int, name varchar(100), email varchar(100)); insert into my_table values (1, 'shekh', 'shekh@rms.com'); insert into my_table values (1, 'shekh', 'shekh@rms.com'); insert into my_table values (2, 'Aman', 'aman@rms.com'); insert into my_table values (3, 'Tom', 'tom@rms.com'); insert into my_table values (4, 'Raj', 'raj@rms.com'); Select COUNT(1) As Total_Rows from my_table Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc
-
==============================
13.이것은 내가 함께 왔어요 쉬운 일이다. 그것은 공통 테이블 식 (CTE) 및 파티션 창을 (내가 생각하는이 기능은 SQL 2008에있는 이상) 사용합니다.
이것은 내가 함께 왔어요 쉬운 일이다. 그것은 공통 테이블 식 (CTE) 및 파티션 창을 (내가 생각하는이 기능은 SQL 2008에있는 이상) 사용합니다.
이 예는 중복 된 이름과 생년월일 모든 학생을 찾습니다. 필드는 당신은 OVER 절에서 중복 이동을 확인하고 싶다. 당신은 당신이 투사에서 원하는 다른 필드를 포함 할 수 있습니다.
with cte (StudentId, Fname, LName, DOB, RowCnt) as ( SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt FROM tblStudent ) SELECT * from CTE where RowCnt > 1 ORDER BY DOB, LName
-
==============================
14.우리는 어떻게 중복 값을 셀 수 ?? 하나는 2 배 이상이 반복된다. 그냥 계산하지 그룹 현명한.
우리는 어떻게 중복 값을 셀 수 ?? 하나는 2 배 이상이 반복된다. 그냥 계산하지 그룹 현명한.
단순하게
select COUNT(distinct col_01) from Table_01
-
==============================
15.CTE를 사용하여도 우리는이 같은 중복 된 값을 찾을 수 있습니다
CTE를 사용하여도 우리는이 같은 중복 된 값을 찾을 수 있습니다
with MyCTE as ( select Name,EmailId,ROW_NUMBER() over(PARTITION BY EmailId order by id) as Duplicate from [Employees] ) select * from MyCTE where Duplicate>1
-
==============================
16.
select emp.ename, emp.empno, dept.loc from emp inner join dept on dept.deptno=emp.deptno inner join (select ename, count(*) from emp group by ename, deptno having count(*) > 1) t on emp.ename=t.ename order by emp.ename /
-
==============================
17.
select id,name,COUNT(*) from user group by Id,Name having COUNT(*)>1
-
==============================
18.ID HAVING COUNT (ID) BY 표 군으로부터 SELECT ID, COUNT (ID)> 1;
ID HAVING COUNT (ID) BY 표 군으로부터 SELECT ID, COUNT (ID)> 1;
나는이 특정 열에서 반복 값을 검색 제대로 작동 것이라 생각합니다.
-
==============================
19.
SELECT * FROM users u where rowid = (select max(rowid) from users u1 where u.email=u1.email);
-
==============================
20.이것은 또한 작업, 어쩌면 시도 제공해야합니다.
이것은 또한 작업, 어쩌면 시도 제공해야합니다.
Select * from Users a where EXISTS (Select * from Users b where ( a.name = b.name OR a.email = b.email) and a.ID != b.id)
당신은 접두사 또는 예를 들어, 같은 일반적인 변화의 몇 가지 종류가 중복 귀하의 경우 특히 좋은 검색하는 경우 메일에서 새 도메인. 당신은이 컬럼에서) (대체 사용할 수 있습니다
-
==============================
21.당신은 (하나 또는 여러 CRITERIAS가) 중복 된 데이터를 찾아 실제 행을 선택합니다.
당신은 (하나 또는 여러 CRITERIAS가) 중복 된 데이터를 찾아 실제 행을 선택합니다.
with MYCTE as ( SELECT DuplicateKey1 ,DuplicateKey2 --optional ,count(*) X FROM MyTable group by DuplicateKey1, DuplicateKey2 having count(*) > 1 ) SELECT E.* FROM MyTable E JOIN MYCTE cte ON E.DuplicateKey1=cte.DuplicateKey1 AND E.DuplicateKey2=cte.DuplicateKey2 ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt
http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/
-
==============================
22.이름이 중복되어 삭제 기록에
이름이 중복되어 삭제 기록에
;WITH CTE AS ( SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY name) AS T FROM @YourTable ) DELETE FROM CTE WHERE T > 1
-
==============================
23.테이블에서 중복 레코드에서 확인합니다.
테이블에서 중복 레코드에서 확인합니다.
select * from users s where rowid < any (select rowid from users k where s.name = k.name and s.email = k.email);
또는
select * from users s where rowid not in (select max(rowid) from users k where s.name = k.name and s.email = k.email);
테이블에 중복 레코드를 삭제합니다.
delete from users s where rowid < any (select rowid from users k where s.name = k.name and s.email = k.email);
또는
delete from users s where rowid not in (select max(rowid) from users k where s.name = k.name and s.email = k.email);
-
==============================
24.
SELECT name, email,COUNT(email) FROM users WHERE email IN ( SELECT email FROM users GROUP BY email HAVING COUNT(email) > 1)
-
==============================
25.SELECT COLUMN_NAME, TABLE_NAME GROUP BY 컬럼 1의 FROM COUNT (*)를 갖는 COUNT (*)> 1;
SELECT COLUMN_NAME, TABLE_NAME GROUP BY 컬럼 1의 FROM COUNT (*)를 갖는 COUNT (*)> 1;
-
==============================
26.아래 그림과 같이 우리는 집계 함수에 작동하는 현재 가지고 사용할 수 있습니다
아래 그림과 같이 우리는 집계 함수에 작동하는 현재 가지고 사용할 수 있습니다
create table #TableB (id_account int, data int, [date] date) insert into #TableB values (1 ,-50, '10/20/2018'), (1, 20, '10/09/2018'), (2 ,-900, '10/01/2018'), (1 ,20, '09/25/2018'), (1 ,-100, '08/01/2018') SELECT id_account , data, COUNT(*) FROM #TableB GROUP BY id_account , data HAVING COUNT(id_account) > 1 drop table #TableB
여기에서 두 개의 필드가 id_account 및 데이터 개수와 함께 사용되는 바와 같이 (*). 그래서, 그것은 모두 열 개 이상의 시간 같은 값을 가지는 모든 레코드를 제공 할 것입니다.
우리는 어떤 이유로 mistakely 우리는 SQL 서버 테이블의 모든 제약 조건을 추가 할 수 놓쳤다와 기록은 프런트 엔드 응용 프로그램과 모든 열에서 중복을 삽입되었습니다. 그런 다음 우리는 테이블에서 중복 쿼리를 삭제 쿼리 아래에 사용할 수 있습니다.
SELECT DISTINCT * INTO #TemNewTable FROM #OriginalTable TRUNCATE TABLE #OriginalTable INSERT INTO #OriginalTable SELECT * FROM #TemNewTable DROP TABLE #TemNewTable
여기서 우리는 시킴으로 빨리 테이블의 모든 별개의 기록을 촬영하고 원래 테이블의 레코드를 삭제했습니다. 다시 우리는 원래 테이블에 새 테이블에서 모든 고유 값을 삽입 한 후 새 테이블을 삭제.
-
==============================
27.이 작업을 시도 할 수 있습니다
이 작업을 시도 할 수 있습니다
SELECT NAME, EMAIL, COUNT(*) FROM USERS GROUP BY 1,2 HAVING COUNT(*) > 1
-
==============================
28.당신은 중복을 제거하는 SELECT DISTINCT 키워드를 사용할 수 있습니다. 또한 이름으로 필터링하고 테이블에 그 이름을 가진 사람을 얻을 수 있습니다.
당신은 중복을 제거하는 SELECT DISTINCT 키워드를 사용할 수 있습니다. 또한 이름으로 필터링하고 테이블에 그 이름을 가진 사람을 얻을 수 있습니다.
-
==============================
29.정확한 코드는 동일한 이메일과 이름을 잘 않거나 다른 식별자로 중복 행을 찾을 것인지 여부에 따라 다를 것입니다. ID가 다른 기본 키 또는 경우 이러한 구별이 존재하지 않는 고유 제한 조건이 있지만, 문제는이를 지정하지 않습니다. 전자의 경우에는 여러 다른 답변에 주어진 코드를 사용할 수 있습니다 :
정확한 코드는 동일한 이메일과 이름을 잘 않거나 다른 식별자로 중복 행을 찾을 것인지 여부에 따라 다를 것입니다. ID가 다른 기본 키 또는 경우 이러한 구별이 존재하지 않는 고유 제한 조건이 있지만, 문제는이를 지정하지 않습니다. 전자의 경우에는 여러 다른 답변에 주어진 코드를 사용할 수 있습니다 :
SELECT name, email, COUNT(*) FROM users GROUP BY name, email HAVING COUNT(*) > 1
후자의 경우 다음을 사용 :
SELECT name, email, COUNT(DISTINCT id) FROM users GROUP BY name, email HAVING COUNT(DISTINCT id) > 1 ORDER BY COUNT(DISTINCT id) DESC
-
==============================
30.어떻게 테이블에 중복 기록을 얻을 수 있습니다
어떻게 테이블에 중복 기록을 얻을 수 있습니다
SELECT COUNT(EmpCode),EmpCode FROM tbl_Employees WHERE Status=1 GROUP BY EmpCode HAVING COUNT(EmpCode) > 1
from https://stackoverflow.com/questions/2594829/finding-duplicate-values-in-a-sql-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] NOT IN 절 내부에 NULL 값 (0) | 2020.03.07 |
---|---|
[SQL] 어떻게 MySQL의에서 AUTO_INCREMENT를 재설정? (0) | 2020.03.07 |
[SQL] 측면과 PostgreSQL에서 하위 쿼리의 차이점은 무엇입니까? (0) | 2020.03.07 |
[SQL] 기존 컬럼에 ID를 추가 (0) | 2020.03.07 |
[SQL] SQL은 조인 절에 where 절 대를 (0) | 2020.03.07 |