sql >> Database >  >> RDS >> Mysql

MySQL selecteert records voor duplicaten met meerdere kolommen

Als u duplicaten tussen meerdere kolommen wilt tellen, gebruikt u group by :

select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
from table
group by ColumnA, ColumnB, ColumnC

Als je alleen de waarden wilt die gedupliceerd zijn, dan is de telling groter dan 1. Je krijgt dit met de having clausule:

select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
from table
group by ColumnA, ColumnB, ColumnC
having NumDuplicates > 1

Als u alle dubbele rijen wilt retourneren, voegt u de laatste query toe aan de oorspronkelijke gegevens:

select t.*
from table t join
     (select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
      from table
      group by ColumnA, ColumnB, ColumnC
      having NumDuplicates > 1
     ) tsum
     on t.ColumnA = tsum.ColumnA and t.ColumnB = tsum.ColumnB and t.ColumnC = tsum.ColumnC

Dit werkt, ervan uitgaande dat geen van de kolomwaarden NULL is. Zo ja, probeer dan:

     on (t.ColumnA = tsum.ColumnA or t.ColumnA is null and tsum.ColumnA is null) and
        (t.ColumnB = tsum.ColumnB or t.ColumnB is null and tsum.ColumnB is null) and
        (t.ColumnC = tsum.ColumnC or t.ColumnC is null and tsum.ColumnC is null)

BEWERKEN:

Als u NULL . heeft waarden, kunt u ook de NULL . gebruiken -veilige operator:

     on t.ColumnA <=> tsum.ColumnA and
        t.ColumnB <=> tsum.ColumnB and
        t.ColumnC <=> tsum.ColumnC 


  1. Ontdek de oorzaken en oplossingen van corruptie in de SQL Server-database

  2. Hoe lege spaties in null-waarden om te zetten met behulp van SQL Server?

  3. Hoe gebruik ik variabelen in Oracle SQL Developer?

  4. HAS_DBACCESS() – Ontdek of een gebruiker toegang heeft tot een database in SQL Server