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

Requêtes et SQL. Discussion :

Suppression dans une table à partir d'une requete


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 11
    Points
    11
    Par défaut Suppression dans une table à partir d'une requete
    Salut à tous,
    Mon soucis, c'est que j'ai une table ayant plusieurs champs on va dire 5. Dans cette table j'ai des doublons par rapports à 4 champs dont le premier est la clef primaire, la cinquième fait défaut: exemple
    clef date mois rang num
    450 15 12 père 1
    451 15 12 père 2

    J'ai fait une requete qui me repère les doublons par rapport les 3 champs date mois et rang. Maintenant je veux supprimer les doublons dans la table. Comment faire????

  2. #2
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 87
    Points : 80
    Points
    80
    Par défaut
    desolé la question n'est pas claire
    et tu veux obtenir quoi comme reponse?

  3. #3
    Membre actif
    Avatar de lanonyme
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 229
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Pour supprimer les doublons dont tu as la clef primaire, tu peut utiliser une requete de suppresion avec comme condition cette fameuse clef.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE  * WHERE MaClefPrimaire=valeur;

    Cordialement,

    lanonyme

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Cette requête supprime tous les doublons sur Date/Mois/Rang dont la clé est supérieure à la plus petite clé sur Date/Mois/Rang.
    Elle ne conserve donc que l'enregistrement ayant la plus petite clé.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Table1.Cle, Table1.[Date], Table1.Mois, Table1.rang, Table1.num
    FROM Table1
    WHERE (((Table1.Cle)>(SELECT Min(Cle) FROM Table1 As Tmp2 WHERE Tmp2.[Date] = Table1.[Date] And Tmp2.Mois = Table1.Mois And Tmp2.Rang=Table1.Rang)));

    Autre façon d''écrire avec la clause EXISTS et aboutissant au même résultat.
    Cette requête supprime un enregistrement s'il existe un autre Date/Mois/Rang ayant une clé plus petite que celle de cet enregistrement.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Table1.Cle, Table1.Date, Table1.Mois, Table1.rang, Table1.num
    FROM Table1
    WHERE EXISTS(SELECT * FROM Table1 As Tmp2 WHERE Tmp2.Date = Table1.Date And Tmp2.Mois = Table1.Mois And Tmp2.Rang=Table1.Rang And Tmp2.Cle<Table1.Cle)

    Si tu fais Affichage->Mode feuille de données sur l'une ou l'autre des deux requêtes, tu vois les enregistrements qui vont être supprimés.

    A+

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 11
    Points
    11
    Par défaut Merci
    Merci à tous pour l'intéret que vous avez portez à ma requete, merci beaucoup.
    Je test ce que vous m'avez proposez et je vous tiens au courant, mais je suis confiant que le soucis est réglé.
    Merci
    @+

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Salut à tous,

    Pour donner suite à mon problème, j'ai fit ce que LedZeppII a écris, mais en cliquant sur l'affichage tableau, ca prend un temps immense pour afficher et en plus il n'affiche pas tout les éléments. Quand j'utilise le curseur pour aller à la fin du tableau, il prend un temps de plus d'une demi heure, mais n'arrive pas à la fin du tableau.
    Ma question est : Est ce que c'est normal que ca prend autant de temps?
    (Ma table contient environ un million d'enregistrement, elle a environ 18000 doublons)

    Merci d'avance pour vos réponses

    @+

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Effectivement c'est long. J'ai créé une table de plus d'1 millions d'enregistrements et je n'ai pas de résultat non plus.
    Je ne sais pas comment optimiser (si cela est possible) l'une ou l'autre de mes deux requêtes.

    Une méthode que j'utilise dans un tel cas.

    1. Exécuter un code vba qui crée une table avec les doublons à supprimer.
    Même principe qu'avec les requêtes : on garde le doublon ayant la plus petite clé.

    Exemple avec Table1(Cle, Date, Mois, Rang, ...).
    On cherche les doublons sur Mois/Date/Rang --> résultat dans table Table1_Doublons
    Code vb : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub CreerTblDoublons()
    Dim db As Database, r As DAO.Recordset, strSQL As String
    Dim rDoublons As DAO.Recordset
    Dim strCKey As String, strPKey As String
    Dim strTable As String, strTblDoublons As String
     
    strTable = "Table1"
    strTblDoublons = strTable & "_Doublons"
    DoCmd.SetWarnings False
    DoCmd.RunSQL "SELECT TOP 1 Cle INTO [" & strTblDoublons & "] FROM [" & strTable & "]"
    DoCmd.RunSQL "DELETE  FROM [" & strTblDoublons & "]"
    DoCmd.SetWarnings True
     
    Set db = CurrentDb
    strSQL = "SELECT Mois, Date, Rang, Cle " & _
             "FROM [" & strTable & "] " & _
             "ORDER BY Mois, Date, Rang, Cle"
    Set r = db.OpenRecordset(strSQL, dbOpenForwardOnly)
    Set rDoublons = db.OpenRecordset(strTblDoublons)
     
    Do While Not r.EOF
        strCKey = Format(r!mois, "00") & Format(r!Date, "00") & r!Rang
        If strCKey = strPKey Then
           rDoublons.AddNew
           rDoublons!Cle = r!Cle
           rDoublons.Update
        End If
        r.MoveNext
        strPKey = strCKey
    Loop
     
    rDoublons.Close
    r.Close
    db.Close
    End Sub
    2. Requête Suppression
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Table1.Cle
    FROM Table1
    WHERE (((Table1.Cle) In (SELECT Cle FROM Table1_Doublons)));

    Ça pourrait se faire en une seule fois, tout en code. Mais ainsi on peut vérifier avant ce qui va être supprimé.

    A+

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 11
    Points
    11
    Par défaut PB résolu
    Merci beaucoup à vous tous pour vos réponses, merci beaucoup à toi LedZeppII pour ton programme, merci ca fonctionne a merveille.
    Dokko

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. [Tables] Update d'une table à partir d'une autre
    Par le_niak dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/01/2008, 09h01
  3. modifié une table à partir d'une requete
    Par moicats dans le forum Access
    Réponses: 5
    Dernier message: 15/05/2006, 16h37
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. Créer une table à partir d'une autre dans un script
    Par Dam)rpgheaven dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/06/2005, 10h55

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