2010-09-23 7 views
0

À mon travail, nous avons des données stockées dans une base de données, les données ne sont pas normalisées. Je cherche un moyen de trouver quelles données ont été dupliquées.SQL Recherche de doublons de lignes multiples

colonnes, Nom, État, Stratégie

Notre base de données dispose de 3 lignes Cette puissance de données ressemble à quelque chose comme ceci:

OldTable: 
Name | State | Strat 
-----+-------+------ 
A | M  | 1 
A | X  | 3 
B | T  | 6 
C | M  | 1 
C | X  | 3 
D | X  | 3 

Ce que je voudrais faire est de déplacer les données à deux tables , l'un contenant le nom de l'autre contenant l'ensemble de l'Etat et Strat il ressemblerait plus à ce

NewTable0: 
Name | StratID 
-----+-------- 
A | 1 
B | 2 
C | 1 
D | 3 

NewTable1: 
StratID | State | Strat 
--------+-------+------ 
1  | M  | 1  
1  | X  | 3 
2  | T  | 6 
3  | X  | 3 

Ainsi, dans les données exemple A et C serait en double, mais D serait pas t être. Comment pourrais-je trouver et/ou identifier ces doublons?

+0

Cela dépend fortement du SGBD que vous utilisez – zerkms

+0

Quelle est la relation entre 'OldTable.Stra t' et le nouveau 'StratID'? – APC

+0

@Zerkms, j'utilise MSSQL – Apeiron

Répondre

1

Essayez:

SELECT OT1.Name Name1, OT2.Name Name2 
FROM OldTable OT1 
JOIN OldTable OT2 ON OT1.Name < OT2.Name AND 
        OT1.State = OT2.State AND 
        OT1.Strat = OT2.Strat 
GROUP BY OT1.Name, OT2.Name 
HAVING COUNT(*) = (SELECT COUNT(*) FROM OldTable TC1 WHERE TC1.NAME = OT1.NAME) 
    AND COUNT(*) = (SELECT COUNT(*) FROM OldTable TC2 WHERE TC2.NAME = OT2.NAME) 
+0

Très belle solution, je l'ai testé avec quelques ensembles de données que je savais avoir des doublons et voilà, ça a marché. Une chose que je ne comprends pas est OT1.Name Apeiron

+0

@Apeiron, j'étais préoccupé par la possibilité que leur pourrait être beaucoup plus de deux noms avec le même ensemble d'états et de strats - 'OT1.Name

+0

La partie principale de la requête trouve le nombre de combinaisons que toutes les paires de noms ont en commun, tandis que chacune des conditions HAVING compare ceci avec le nombre total de combinaisons pour chacun des noms de la paire. –

1

Vous pouvez trouver cela en regroupant les noms ensemble, et la liste que ceux où il y a plus d'un enregistrement:

SELECT OldTable.Name, COUNT(1) Duplicates 
FROM OldTable 
GROUP BY OldTable.Name 
HAVING Duplicates > 1 

sortie doit:

OldTable: 
Name | Duplicates 
-----+------------ 
A | 2 
C | 2 
+0

sauf que cela n'attrape pas les cas qui ont le même nombre d'entrées, mais dont les entrées diffèrent. – Apeiron

Questions connexes