Como encontrar linhas que são duplicadas por uma chave, mas não duplicadas em todas as colunas?
Estou trabalhando com uma tabela que é um extrato de um conjunto de outras tabelas. Todas as linhas da tabela de extração devem ser exclusivas de acordo com as teclas D1, D2 e D3. Eles não são. Parece que um desenvolvedor anterior tentou resolver esse problema usando umSELECT DISTINCT
em todas as colunas que estão sendo consultadas nesta tabela. Isso funcionará, mas apenas se todas as linhas duplicadas (D1, D2, D3) também forem duplicadas nas colunas sem chave (ignorando a coluna IDENTITY que foi adicionada à tabela de extração).
Em outras palavras, determinadas linhas da seguinte maneira:
D1 D2 D3 C4 C5 C6
=== === === === === ===
A B C X1 X2 X3
A B C X1 X2 X3
então
SELECT DISTINCT D1, D2, D3, C4, C5, C6
FROM BAD_TABLE
funcionará, pois não há diferença entre as linhas duplicadas (D1, D2, D3). Mas se a tabela continha
D1 D2 D3 C4 C5 C6
=== === === === === ===
A B C X1 X2 X3
A B C X1 X2 X4
então SELECT DISTINCT retornaria duas linhas para a chave (A, B, C). Além disso, teríamos que decidir qual dos X3 ou X4 era o valor "correto".
Eu sei como encontrar as duplicatas em (D1, D2, D3). Eu até sei como encontrar as duplicatas em todas as colunas (exceto a coluna IDENTITY):
;
WITH DUPLICATES(D1,D2,D3) AS
(
SELECT D1, D2, D3
FROM SOURCE
GROUP BY D1, D2, D3
HAVING COUNT(*)>1
)
SELECT S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
FROM SOURCE S
INNER JOIN DUPLICATES D
ON S.D1 = D.D1 AND S.D2 = D.D2 AND S.D3 = D.D3
ORDER BY S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
A questão é: como encontro o subconjunto do conjunto de resultados acima duplicado em (D1, D2, D3), masnão duplicatas em (D1, D2, D3, C4, C5, C6)?