2010-12-14 7 views
2

Si mon titre vous blesse la tête ... Je suis avec vous. Je ne veux pas comprendre pourquoi cette table existe, sauf qu'elle fait partie d'un système hérité, aussi le système fait-il un "accès au niveau d'enregistrement" (RLA) et je sais que ce sera un problème pour de nombreuses tables, de toute façon le RLA est mentionné parce que l'ajout d'une colonne va changer le format de la table et puis beaucoup de très vieux programmes ne fonctionneront plus ...SQL pour trouver pourquoi PK canidate a des doublons sur une table non-clé

Apparemment ajouter un PK a été montré pour ne pas changer le format de la table. Donc on m'a dit qu'un certain ensemble de clés est garanti pour être unique, bien que sais-tu ... ce n'est pas le cas. Et maintenant je dois montrer où ils ne sont pas.

Tout ce que je peux penser est:

Obtenez le produit croisé où la table correspond à c'est la clé primaire.

D'une manière ou d'une autre, obtenez une colonne de comptage sur le jeu de résultats pour le nombre d'entrées où le PK correspond à lui-même.

filtre qui jeu de résultats pour les valeurs où id nombre supérieur à 2.

Je vais voir si j'Allongez la PK suffisamment, je vais effectivement trouver quelque chose d'unique.

+0

Voulez-vous dire « l'ajout d'une ligne va changer le format de table » ou « l'ajout d'une colonne changer le format de table » –

+0

Ah ... une colonne, je vais fixer la question. – Quaternion

Répondre

4

les contraintes/Supprimer les index uniques, insérer les données, puis exécutez cette requête:

SELECT col1, col2, ..., coln, COUNT(*) 
FROM your_table 
GROUP BY col1, col2, ..., coln 
HAVING COUNT(*) > 1 

col1, col2, ..., coln est la liste des colonnes dans la clé (une des colonnes ou plus). Le résultat sera la liste des clés qui se produisent plus d'une fois avec un nombre indiquant combien de fois ils se produisent.

+0

C'était trop facile! J'avais sélectionné à l'intérieur des sélections ... c'était horrible – Quaternion

2
SELECT * FROM (SELECT ID, COUNT(*) CNT FROM MY_TABLE GROUP BY ID) WHERE CNT > 1 
3
select col1, ... from tab group by col1, ... having count(*)>1; 
Questions connexes