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