10
votes

SQL: Comment fusionner des doublons de casse-insensibles

Quel serait le meilleur moyen de supprimer des doublons tout en fusionnant leurs dossiers en un?

J'ai une situation où la table contient une trace des noms de joueurs et de leurs enregistrements comme celui-ci: P>

update stats
set totalgames = totalgames + s.totalgames
from (that query up there) s
where lower(nick) = s.nick


3 commentaires

Votre table statistiques a-t-elle un champ d'identification unique et numérique?


Non. La clé primaire est la colonne Nick. Je pourrais faire des identités, mais je devrais alors changer le logiciel ... (Je n'ai pas fait commencer par commencer, j'ai rejoint plus tard) alors je pense que cela pourrait être hors de l'option.


Pas de problème - cela change simplement comment je ferais la suppression. Réponse à venir.


4 Réponses :


10
votes

SQL Fiddle

Voici votre mise à jour: P>

CREATE UNIQUE INDEX ON stats (LOWER(nick)); 


4 commentaires

Wut. Cette mise à jour est presque identique à ce que j'avais déjà! J'étais tellement proche :( hmm, la chose est que j'ai déjà une clé primaire sur la colonne Nick - pensez-vous à vous en débarrasser et à créer l'index unique est nécessaire?


Eh bien, cela dépend de la façon dont vous voulez gérer ces valeurs. Si vous souhaitez interdire les valeurs non minuscules complétantes, vous pouvez ajouter une contrainte sur cette colonne ("Alter Table Statisttes Ajouter une contrainte Downcase_Nick Check ((Nick) :: Texte = Basse ((Nick) :: Texte))"). (C'est ce que je ferais.) Si vous souhaitez autoriser des valeurs mixtes tant que les versions basses sont propres à éviter la situation dans laquelle vous vous trouvez, vous pouvez simplement mettre à jour l'index existant pour utiliser la valeur minuscule.


Oui, je suppose. Je viens de décider de forcer le logiciel à tout minuscule avant d'interagir avec la DB. Merci pour l'aide.


Vous voudrez peut-être toujours ajouter la contrainte que j'ai postée ci-dessus. Votre code peut faire la bonne chose, mais il ne fait jamais de mal d'avoir le chèque supplémentaire au niveau de la base de données. J'aime toujours protéger contre d'autres développeurs futurs changeant ou ajoutant une méthode d'entrée permettant aux données sales.



0
votes

Mettre à jour STATS SET TOTALGAMES = S.TOTALGAMES, WINS = S.WINS
à partir de (Sélectionnez Basse (Nick) comme Nick, Somme (TotalGames) comme totalGames, somme (gagne) comme gagne des statistiques Groupe par la baisse (Nick)) S où est inférieur (nick) = s.nick;
Supprimer des statistiques où
Basse (Nick) dans (Sélectionnez Basse (Nick) du groupe Stats en bas (Nick) ayant le nombre (*)> 1)
Et pas plus bas (Nick) dans (Sélectionnez le premier (Nick) du groupe Stats par Basse (Nick) devrait fonctionner.


0 commentaires

3
votes

Il peut tous être fait dans une seule instruction, en utilisant retourner code>. xxx pré>

sortie: p>

INSERT 0 5
  nick   | totalgames | wins 
---------+------------+------
 John    |        100 |   40
 john    |        200 |   97
 Whistle |         50 |   47
 wHiStLe |         75 |   72
 Single  |         42 |   13
(5 rows)

DELETE 2
  nick   | totalgames | wins 
---------+------------+------
 wHiStLe |        125 |  119
 john    |        300 |  137
 Single  |         42 |   13
(3 rows)


0 commentaires

4
votes

Je pense que je pense que la meilleure façon de le faire dans une requête utiliserait Common Expressions de table : xxx

Comme vous le voyez, à l'intérieur du CTE, je supprimez des doublons et retourner des lignes supprimées, après l'insertion de données supprimées groupées dans la table. < p> voir SQL Fiddle Démo


0 commentaires