IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Procédure de dédoublonnage


Sujet :

MS SQL Server

  1. #1
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'Etudes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut Procédure de dédoublonnage
    Bonjour, j'ai une base de données que je souhaiterais dédoublonner sur l'adresse Email.

    Pour celà je suis en train de construire une procédure stockée pour garder, de toutes les lignes qui possèdent la même adresse mail, la dernière. J'imagine ( si vous avez de meilleures idées n'hésitez pas ) utiliser deux curseurs sur l'adresse mail.
    Pour chaque adresse prise par le premier, le second va donc parcourir la table, si une correspondance est trouvée, la ligne du premier est supprimée et on recommence.

    trois questions : comment supprimer la ligne courante d'un curseur, et puis-je faire dans la procédure un order by Email pour que la procédure soit plus rapide ? Il faudrait que le second curseur démarre à la ligne directement après la ligne courante du premier, comment faire ?

    edit : en fait en écrivant celà je réalise que je peux faire pour le second curseur un select * where Email=valeur du premier... mais alors comment supprimer toutes les lignes de ce résultat sauf la dernière ?

    edit2 : voilà à quoi ca pourrait ressembler ( avec un seul curseur ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CREATE PROCEDURE dedoub AS
      DECLARE @mailRef VARCHAR(64)
      DECLARE @compte INT
     
      DECLARE curseur CURSOR for
        SELECT * FROM ( SELECT count(*) as Expr1, Email from Adresses group by Email ) where Expr1 >1
     
      OPEN curseur
      FETCH curseur into @compte, @mailRef
      WHILE @@FETCH_STATUS=0 BEGIN
         DELETE TOP (@compte - 1) from Adresses where Email=@mailRef
         FETCH curseur into @compte, @mailRef
      END
      CLOSE curseur
      DEALLOCATE curseur
    est ce que celà serait correct ? ( outre le fait que sqlserver me signale une erreur "vers le mot clé where" que je ne trouve pas )

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DELETE FROM Adresses
    FROM Adresses AS A1
    CROSS APPLY (
    	SELECT
    		A2.id -- vous avez un identifiant unique ?
    		, ROW_NUMBER() OVER (PARTITION BY A2.Email ORDER BY A2.id DESC) AS NB
    	FROM Adresses AS A2
    ) EXT
    WHERE EXT.id = A1.id
    AND EXT.NB > 1
    Most Valued Pas mvp

  3. #3
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'Etudes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    ouh, pas mal de choses là dedans que je ne connais pas, je vais me pencher là dessus. Sinon non pour l'instant pas d'identifiant unique dans cette table, mais je peux en rajouter un pour l'occasion.

    à priori la proc que je proposais marcherait, l'erreur de syntaxe a été résolu en rajoutant des parenthèses autour de la clause where, mais j'ai un timeout au bout de 20 secondes et je n'ai pas trouvé où modifier la limite de timeout pour les procédures ^^'

    edit : c'est normal la repetition de "from Adresses" au début ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par argonath Voir le message
    ouh, pas mal de choses là dedans que je ne connais pas, je vais me pencher là dessus. Sinon non pour l'instant pas d'identifiant unique dans cette table, mais je peux en rajouter un pour l'occasion.
    Voilà.

    Citation Envoyé par argonath Voir le message
    edit : c'est normal la repetition de "from Adresses" au début ?
    Absolument.

    PS: Il y avait une typo dans mon code
    Most Valued Pas mvp

  5. #5
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'Etudes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    Merci beaucoup pour cette solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  3. ProgressBar avec plusieurs procédures
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/09/2002, 18h03
  4. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo