[SQL] SQL 서버에서 중복 행을 찾기
SQLSQL 서버에서 중복 행을 찾기
나는 조직의 SQL Server 데이터베이스를 가지고 있고, 많은 중복 행이 있습니다. 나는이와 속는의 양을 모두 잡아 SELECT 문을 실행할뿐만 아니라 각 조직과 관련된 ID를 반환합니다.
성명 같은 :
SELECT orgName, COUNT(*) AS dupes
FROM organizations
GROUP BY orgName
HAVING (COUNT(*) > 1)
같은를 반환합니다
orgName | dupes
ABC Corp | 7
Foo Federation | 5
Widget Company | 2
그러나 나는 그들의 ID를 잡기 위해 또한 같은 것입니다. 이 작업을 수행 할 수있는 방법이 있습니까? 어쩌면 같은
orgName | dupeCount | id
ABC Corp | 1 | 34
ABC Corp | 2 | 5
...
Widget Company | 1 | 10
Widget Company | 2 | 2
그 이유는 이러한 조직에 대한 링크가, 내가 (사용자가 속는 여러 조직 대신 같은 조직에 링크 그러므로 속는 제거)를 통합하고 싶다고 사용자의 별도의 테이블도이 있다는 것. 하지만하지 나사 무엇을 할 수 있도록 내가 수동 부분을 싶습니다하지만 사용자의 목록을 갈 수 있도록 나는 아직도 모든 속는 여러 조직의 ID를 반환 진술을해야합니다.
해결법
-
==============================
1.
select o.orgName, oc.dupeCount, o.id from organizations o inner join ( SELECT orgName, COUNT(*) AS dupeCount FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) oc on o.orgName = oc.orgName
-
==============================
2.다음과 같은 쿼리를 실행하고 최대 (ID)와 중복을 발견하고 해당 행을 삭제할 수 있습니다.
다음과 같은 쿼리를 실행하고 최대 (ID)와 중복을 발견하고 해당 행을 삭제할 수 있습니다.
SELECT orgName, COUNT(*), Max(ID) AS dupes FROM organizations GROUP BY orgName HAVING (COUNT(*) > 1)
하지만 당신은이 쿼리를 몇 번 실행해야합니다.
-
==============================
3.당신은 이런 식으로 작업을 수행 할 수 있습니다 :
당신은 이런 식으로 작업을 수행 할 수 있습니다 :
SELECT o.id, o.orgName, d.intCount FROM ( SELECT orgName, COUNT(*) as intCount FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) AS d INNER JOIN organizations o ON o.orgName = d.orgName
당신은 (각 중 하나를 떠나) 삭제 될 수 있습니다 단지 레코드를 반환하려는 경우, 당신은 사용할 수 있습니다 :
SELECT id, orgName FROM ( SELECT orgName, id, ROW_NUMBER() OVER (PARTITION BY orgName ORDER BY id) AS intRow FROM organizations ) AS d WHERE intRow != 1
편집 : SQL 서버 2000는 ROW_NUMBER () 함수를 가지고 있지 않습니다. 대신, 당신은 사용할 수 있습니다 :
SELECT o.id, o.orgName, d.intCount FROM ( SELECT orgName, COUNT(*) as intCount, MIN(id) AS minId FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) AS d INNER JOIN organizations o ON o.orgName = d.orgName WHERE d.minId != o.id
-
==============================
4.올바른으로 표시이 솔루션은 나를 위해 작동하지 않았다, 그러나 나는 단지 좋은 일이 대답을 발견한다 : mysql에서 중복 행의 목록을 가져옵니다을
올바른으로 표시이 솔루션은 나를 위해 작동하지 않았다, 그러나 나는 단지 좋은 일이 대답을 발견한다 : mysql에서 중복 행의 목록을 가져옵니다을
SELECT n1.* FROM myTable n1 INNER JOIN myTable n2 ON n2.repeatedCol = n1.repeatedCol WHERE n1.id <> n2.id
-
==============================
5.당신이 시도 할 수 있습니다, 그것은 당신을 위해 최선
당신이 시도 할 수 있습니다, 그것은 당신을 위해 최선
WITH CTE AS ( SELECT *,RN=ROW_NUMBER() OVER (PARTITION BY orgName ORDER BY orgName DESC) FROM organizations ) select * from CTE where RN>1 go
-
==============================
6.당신은 삭제 중복하려는 경우 :
당신은 삭제 중복하려는 경우 :
WITH CTE AS( SELECT orgName,id, RN = ROW_NUMBER()OVER(PARTITION BY orgName ORDER BY Id) FROM organizations ) DELETE FROM CTE WHERE RN > 1
-
==============================
7.
select * from [Employees]
중복 레코드를 찾는 1) CTE 사용
with mycte as ( select Name,EmailId,ROW_NUMBER() over(partition by Name,EmailId order by id) as Duplicate from [Employees] ) select * from mycte
2)를 사용하여 GROUPBY
select Name,EmailId,COUNT(name) as Duplicate from [Employees] group by Name,EmailId
-
==============================
8.
Select * from (Select orgName,id, ROW_NUMBER() OVER(Partition By OrgName ORDER by id DESC) Rownum From organizations )tbl Where Rownum>1
rowum로 기록 그래서> 1 테이블에서 중복 레코드 될 것입니다. 먼저 기록에 의해 그룹 '으로 파티션은'그들에게 일련 번호를 부여하여이를 직렬화. ROWNUM 그래서> 1은 삭제 될 수있는 중복 레코드 될 것입니다.
-
==============================
9.
select column_name, count(column_name) from table_name group by column_name having count (column_name) > 1;
SRC : https://stackoverflow.com/a/59242/1465252
-
==============================
10.
select a.orgName,b.duplicate, a.id from organizations a inner join ( SELECT orgName, COUNT(*) AS duplicate FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) b on o.orgName = oc.orgName group by a.orgName,a.id
-
==============================
11.
select orgname, count(*) as dupes, id from organizations where orgname in ( select orgname from organizations group by orgname having (count(*) > 1) ) group by orgname, id
-
==============================
12.당신은 선택 중복 행에 대한 몇 가지 방법이있다.
당신은 선택 중복 행에 대한 몇 가지 방법이있다.
내 솔루션을 먼저 예를 들어,이 테이블을 고려
CREATE TABLE #Employee ( ID INT, FIRST_NAME NVARCHAR(100), LAST_NAME NVARCHAR(300) ) INSERT INTO #Employee VALUES ( 1, 'Ardalan', 'Shahgholi' ); INSERT INTO #Employee VALUES ( 2, 'name1', 'lname1' ); INSERT INTO #Employee VALUES ( 3, 'name2', 'lname2' ); INSERT INTO #Employee VALUES ( 2, 'name1', 'lname1' ); INSERT INTO #Employee VALUES ( 3, 'name2', 'lname2' ); INSERT INTO #Employee VALUES ( 4, 'name3', 'lname3' );
첫 번째 솔루션 :
SELECT DISTINCT * FROM #Employee; WITH #DeleteEmployee AS ( SELECT ROW_NUMBER() OVER(PARTITION BY ID, First_Name, Last_Name ORDER BY ID) AS RNUM FROM #Employee ) SELECT * FROM #DeleteEmployee WHERE RNUM > 1 SELECT DISTINCT * FROM #Employee
두 번째 해결책 : 신원 필드
SELECT DISTINCT * FROM #Employee; ALTER TABLE #Employee ADD UNIQ_ID INT IDENTITY(1, 1) SELECT * FROM #Employee WHERE UNIQ_ID < ( SELECT MAX(UNIQ_ID) FROM #Employee a2 WHERE #Employee.ID = a2.ID AND #Employee.FIRST_NAME = a2.FIRST_NAME AND #Employee.LAST_NAME = a2.LAST_NAME ) ALTER TABLE #Employee DROP COLUMN UNIQ_ID SELECT DISTINCT * FROM #Employee
모든 솔루션의 끝이 명령을 사용하여
DROP TABLE #Employee
-
==============================
13.나는 당신이 필요로하는 것을 알고 있다고 생각 내가 대답 사이에 혼합 필요하고 내가 자기가 원하는 솔루션을 찾은 것 같아 :
나는 당신이 필요로하는 것을 알고 있다고 생각 내가 대답 사이에 혼합 필요하고 내가 자기가 원하는 솔루션을 찾은 것 같아 :
select o.id,o.orgName, oc.dupeCount, oc.id,oc.orgName from organizations o inner join ( SELECT MAX(id) as id, orgName, COUNT(*) AS dupeCount FROM organizations GROUP BY orgName HAVING COUNT(*) > 1 ) oc on o.orgName = oc.orgName
최대 ID를 가진 당신에게 중복의 ID와 그가 요구 것입니다 원래의 하나를 줄 것이다 :
id org name , dublicate count (missing out in this case) id doublicate org name , doub count (missing out again because does not help in this case)
단지 슬픈 것은 당신은이 양식에 넣어 얻을
id , name , dubid , name
여전히 도움이되기를 바랍니다
-
==============================
14.우리는이 열이 테이블에게 테이블 '학생'이 있다고 가정합니다 :
우리는이 열이 테이블에게 테이블 '학생'이 있다고 가정합니다 :
이제 우리는 중복 레코드를보고 싶어 이 쿼리를 사용합니다 :
select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;
+---------------------+------------+---+ | student_name | student_id | c | +---------------------+------------+---+ | usman | 101 | 3 | | muhammadusmanyaqoob | 103 | 2 | +---------------------+------------+---+
-
==============================
15.나는 테이블에서 중복 레코드를 얻을 수있는 더 나은 옵션을 가지고
나는 테이블에서 중복 레코드를 얻을 수있는 더 나은 옵션을 가지고
SELECT x.studid, y.stdname, y.dupecount FROM student AS x INNER JOIN (SELECT a.stdname, COUNT(*) AS dupecount FROM student AS a INNER JOIN studmisc AS b ON a.studid = b.studid WHERE (a.studid LIKE '2018%') AND (b.studstatus = 4) GROUP BY a.stdname HAVING (COUNT(*) > 1)) AS y ON x.stdname = y.stdname INNER JOIN studmisc AS z ON x.studid = z.studid WHERE (x.studid LIKE '2018%') AND (z.studstatus = 4) ORDER BY x.stdname
위의 질의 쇼의 독특한 학생 ID와 중복 차례 나오는 수를 가지는 모든 중복 된 이름 결과
는 SQL의 결과를 보려면 여기를 클릭하십시오
-
==============================
16.
/*To get duplicate data in table */ SELECT COUNT(EmpCode),EmpCode FROM tbl_Employees WHERE Status=1 GROUP BY EmpCode HAVING COUNT(EmpCode) > 1
-
==============================
17.시험
시험
SELECT orgName, id, count(*) as dupes FROM organizations GROUP BY orgName, id HAVING count(*) > 1;
from https://stackoverflow.com/questions/2112618/finding-duplicate-rows-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게하는 테이블이 오라클 SQL Developer에서 특정 테이블을 참조 찾을 수 있습니까? (0) | 2020.04.05 |
---|---|
[SQL] 문자열의 부품을 교체, 열 값을 업데이트 (0) | 2020.04.05 |
[SQL] 그것은) (카운트에 조건을 지정 할 수 있습니까? (0) | 2020.04.05 |
[SQL] SQL Server의 저장 프로 시저에서 텍스트 검색 (0) | 2020.04.05 |
[SQL] 달력 표 - 달의 주 번호 (0) | 2020.04.05 |