it-swarm.com.de

Doppelte Werte in einer SQL-Tabelle suchen

duplicates ist mit einem Feld leicht zu finden:

SELECT name, COUNT(email) 
FROM users
GROUP BY email
HAVING COUNT(email) > 1

Also, wenn wir einen Tisch haben

ID   NAME   EMAIL
1    John   [email protected]
2    Sam    [email protected]
3    Tom    [email protected]
4    Bob    [email protected]
5    Tom    [email protected]

Diese Abfrage gibt uns John, Sam, Tom, Tom, da sie alle dasselbe email haben.

Ich möchte jedoch Duplikate mit den gleichen email und name.

Das heißt, ich möchte "Tom", "Tom" bekommen.

Der Grund, warum ich das brauche: Ich habe einen Fehler gemacht und durfte doppelte name- und email-Werte einfügen. Jetzt muss ich entfernen/ändern die Duplikate, also muss ich zuerst finden.

1527
Alex
SELECT
    name, email, COUNT(*)
FROM
    users
GROUP BY
    name, email
HAVING 
    COUNT(*) > 1

Gruppieren Sie einfach beide Spalten.

Hinweis: Der ältere ANSI-Standard soll alle nicht aggregierten Spalten in GROUP BY enthalten, dies hat sich jedoch mit der Vorstellung von "Funktionsabhängigkeit" geändert:

In der Theorie relationaler Datenbanken ist eine funktionale Abhängigkeit eine Einschränkung zwischen zwei Attributsätzen in einer Relation aus einer Datenbank. Mit anderen Worten ist die funktionale Abhängigkeit eine Einschränkung, die die Beziehung zwischen Attributen in einer Beziehung beschreibt.

Support ist nicht konsistent:

2472
gbn

versuche dies:

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

AUSGABE:

name       email       CountOf
---------- ----------- -----------
John       John-email  2
sam        sam-email   2

(2 row(s) affected)

wenn Sie möchten, dass die IDs der Dups Folgendes verwenden:

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

AUSGABE:

id          name       email
----------- ---------- ------------
1           John       John-email
2           John       John-email
5           sam        sam-email
6           sam        sam-email

(4 row(s) affected)

um die Duplikate zu löschen, versuchen Sie:

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

AUSGABE: 

id          name       email
----------- ---------- --------------
1           John       John-email
3           fred       John-email
4           fred       fred-email
5           sam        sam-email

(4 row(s) affected)
306
KM.

Versuche dies:

SELECT name, email
FROM users
GROUP BY name, email
HAVING ( COUNT(*) > 1 )
98

Wenn Sie die Duplikate löschen möchten, ist dies ein viel einfacherer Weg, als gerade/ungerade Zeilen in einem dreifachen Subselect zu finden:

SELECT id, name, email 
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id

Und so zu löschen:

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
)

Viel leichter zu lesen und zu verstehen, IMHO

Hinweis: Das einzige Problem ist, dass Sie die Anforderung ausführen müssen, bis keine Zeilen gelöscht werden, da Sie jeweils nur eine Kopie jedes Duplikats löschen

50
AncAinu

Versuche Folgendes:

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
34
gaurav singh
 SELECT name, email 
    FROM users
    WHERE email in
    (SELECT email FROM users
    GROUP BY email 
    HAVING COUNT(*)>1)
25

Etwas spät zur Party, aber ich fand eine wirklich coole Lösung, um alle doppelten IDs zu finden:

SELECT GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )
18
Indivision Dev

versuchen Sie diesen Code

WITH CTE AS

( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn)
FROM ccnmaster )
select * from CTE 
15
Tanmay Nehete

Falls Sie mit Oracle arbeiten, ist dieser Weg vorzuziehen:

create table my_users(id number, name varchar2(100), email varchar2(100));

insert into my_users values (1, 'John', '[email protected]');
insert into my_users values (2, 'Sam', '[email protected]');
insert into my_users values (3, 'Tom', '[email protected]');
insert into my_users values (4, 'Bob', '[email protected]');
insert into my_users values (5, 'Tom', '[email protected]');

commit;

select *
  from my_users
 where rowid not in (select min(rowid) from my_users group by name, email);
14
xDBA

Dadurch werden alle doppelten Datensätze mit Ausnahme eines Datensatzes aus jeder Gruppe von Duplikaten ausgewählt bzw. gelöscht. Beim Löschen bleiben also alle eindeutigen Datensätze + ein Datensatz aus jeder Gruppe der Duplikate.

Duplikate auswählen:

SELECT *
FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

Duplikate löschen:

DELETE FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

Beachten Sie größere Mengen an Datensätzen, da dies zu Leistungsproblemen führen kann.  

13
select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1
8
Debendra Dash

Wie können wir die doppelten Werte zählen ?? Entweder werden sie zweimal wiederholt oder größer als 2 . Zählen Sie sie einfach, nicht gruppenweise.

so einfach wie 

select COUNT(distinct col_01) from Table_01
7
Muhammad Tahir

Dies ist die einfache Sache, die ich mir ausgedacht habe. Es verwendet einen allgemeinen Tabellenausdruck (CTE) und ein Partitionsfenster (ich denke, dass diese Funktionen in SQL 2008 und höher enthalten sind).

In diesem Beispiel werden alle Schüler mit doppeltem Namen und dob gefunden. Die Felder, die Sie auf Duplikate prüfen möchten, werden in die OVER-Klausel übernommen. Sie können beliebige andere Felder in die Projektion aufnehmen.

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
6
Darrel Lee
select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users
6
Narendra

Wenn Sie sehen möchten, ob in Ihrer Tabelle doppelte Zeilen vorhanden sind, habe ich unter Abfrage verwendet:

create table my_table(id int, name varchar(100), email varchar(100));

insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (2, 'Aman', '[email protected]');
insert into my_table values (3, 'Tom', '[email protected]');
insert into my_table values (4, 'Raj', '[email protected]');


Select COUNT(1) As Total_Rows from my_table 
Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 
6
shekhar singh

SELECT id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;

Ich denke, dass dies richtig funktioniert, um wiederholte Werte in einer bestimmten Spalte zu suchen.

6
user4877838

Das sollte auch funktionieren, vielleicht probieren.

  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)

Besonders gut in Ihrem Fall Wenn Sie nach Duplikaten suchen, die eine Art Präfix oder allgemeine Änderung wie z. neue Domain in Mail. Dann können Sie replace () in diesen Spalten verwenden

5
veritaS
 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
/
5
naveed

Durch die Verwendung von CTE können wir auch doppelte Werte finden

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
5
Debendra Dash

Wenn Sie doppelte Daten (nach einem oder mehreren Kriterien) suchen und die tatsächlichen Zeilen auswählen möchten.

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/

4
Lauri Lubi
SELECT * FROM users u where rowid = (select max(rowid) from users u1 where
u.email=u1.email);
4
Panky031

SELECT column_name,COUNT(*) FROM TABLE_NAME GROUP BY column1, HAVING COUNT(*) > 1;

1
rahul kumar

So prüfen Sie aus doppeltem Datensatz in einer Tabelle.

select * from users s 
where rowid < any 
(select rowid from users k where s.name = k.name and s.email = k.email);

oder

select * from users s 
where rowid not in 
(select max(rowid) from users k where s.name = k.name and s.email = k.email);

So löschen Sie den doppelten Datensatz in einer Tabelle.

delete from users s 
where rowid < any 
(select rowid from users k where s.name = k.name and s.email = k.email);

oder

delete from users s 
where rowid not in 
(select max(rowid) from users k where s.name = k.name and s.email = k.email);
0
Arun Solomon

Wir können hier verwenden, welche Arbeiten an Aggregatfunktionen wie unten gezeigt

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

Hier werden zwei Felder id_account und Daten mit Count (*) verwendet. Es werden also alle Datensätze ausgegeben, die in beiden Spalten mehr als einmal dieselben Werte haben.

Aus irgendeinem Grund hatten wir versehentlich versäumt, Einschränkungen in der SQL Server-Tabelle hinzuzufügen, und die Datensätze wurden in allen Spalten der Front-End-Anwendung doppelt eingefügt. Dann können wir unten Abfrage verwenden, um doppelte Abfrage aus der Tabelle zu löschen.

SELECT DISTINCT * INTO #TemNewTable FROM #OriginalTable
TRUNCATE TABLE #OriginalTable
INSERT INTO #OriginalTable SELECT * FROM #TemNewTable
DROP TABLE #TemNewTable

Hier haben wir alle unterschiedlichen Datensätze der ursprünglichen Tabelle genommen und die Datensätze der ursprünglichen Tabelle gelöscht. Wieder haben wir alle unterschiedlichen Werte aus der neuen Tabelle in die ursprüngliche Tabelle eingefügt und dann die neue Tabelle gelöscht.

0
Suraj Kumar

Sie können das Schlüsselwort SELECT DISTINCT verwenden, um Duplikate zu entfernen. Sie können auch nach Namen filtern und alle Personen mit diesem Namen in eine Tabelle aufnehmen.

0
Parkofadown

Möglicherweise möchten Sie dies versuchen

SELECT NAME, EMAIL, COUNT(*)
FROM USERS
GROUP BY 1,2
HAVING COUNT(*) > 1
0
adesh

Zum Löschen von Datensätzen mit doppeltem Namen

;WITH CTE AS    
(

    SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY name) AS T FROM     @YourTable    
)

DELETE FROM CTE WHERE T > 1
0
Sheriff