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 :

Traduire une requête Mysql vers accès. le casse tête [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Traduire une requête Mysql vers accès. le casse tête
    Bonjour à tous.

    L'administrateur avec lequel je travaille tient absolument à sauvegarder certaines données dans une table accès.

    Le problème c'est que cette table contient beaucoup de doublons ce qui complique le process suivant, j'ai donc écrit deux requête sous mysql pour nettoyer la table pensant faire la traduction sous accès par la suite.

    Le but de ces requêtes est d'identifier les doublons sur le champ [ID GALIA], de copier certaines données des doublons les plus anciens vers le doublon le plus récent et de supprimer les doublons les plus anciens.

    Problème : je ne comprends pas comment sont gérées les jointure sur accès et je ne parvient pas a faire fonctionner la requête malgré pas mal de temps passé dessus.
    Je n'ai jamais utilisé accès de façon avancé, je suis complètement perdu.

    Je vous met ici les deux requêtes.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    UPDATE eleves AS T 
    LEFT JOIN 
        (SELECT Old_num, New_num, TOld.PrenonNom AS Old_pn, TOld.Mp AS Old_mp
        FROM
            (SELECT MIN(Numéro) AS Old_num, MAX(Numéro) AS New_num
            FROM eleves
            GROUP BY [ID GALIA]a
            HAVING COUNT(*)>1) AS T
            LEFT JOIN eleves AS TOld ON TOld.Numéro = Old_num
        )  AS TL ON T.Numéro = TL.New_num 
    SET T.PrenonNom = TL.Old_pn, T.Mp = TL.Old_Mp
    WHERE TL.New_num IS NOT NULL;
     
    DELETE eleves
    FROM eleves 
    LEFT JOIN 
        (SELECT T2.Numéro FROM 
            (SELECT [ID GALIA], MAX(Numéro) AS New_num 
            FROM eleves 
            GROUP BY [ID GALIA] 
            HAVING COUNT(*)>1) AS T 
        LEFT JOIN eleves AS T2 
        ON (T2.Numéro <> T.New_num) AND (T2.[ID GALIA] = T.[ID GALIA])
       )  AS TD ON eleves.Numéro = TD.Numéro
    WHERE TD.Numéro IS NOT NULL;
    Les cracks de Acces auraient une piste pour faire fonctionner ces left join sur select?

    Merci de votre aide!

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 6
    Points
    6
    Par défaut L'opération doit utiliser une requête qui peut être mis a jour
    Rebonjour,

    J'ai donc un peu avancer dans ma galère Access.

    Une partie de ma requête fonctionne à présent en tout cas les deux premiers LEFT JOIN.

    J'ai décomposé un maximum la première requête (l'UPDATE) en sous requêtes que je vous mets en dessous.

    Première requête nommée
    [_R Old New doublons]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MIN(Numéro) AS Old_num, MAX(Numéro) AS New_num
    FROM eleves
    GROUP BY [ID GALIA]
    HAVING COUNT(*)>1;
    Deuxième requête nommée
    [_R Old New infos]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T.Old_num, T.New_num, E.PrenonNom AS Old_Pn, E.mp AS Old_Mp
    FROM [_R Old New doublons] AS T 
    LEFT JOIN eleves AS E ON T.Old_num = E.Numéro;
    Cette requête m'affiche bien sur une même ligne toutes les infos pour ma mise a jour

    Et enfin la troisième requête qui devrait me faire l'update
    [_R update finale]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE eleves AS EL 
    LEFT JOIN [_R Old New infos] AS ONI 
    ON EL.Numéro = ONI.New_num 
    SET EL.PrenonNom = ONI.Old_Pn, EL.Mp = ONI.Old_Mp
    WHERE (((ONI.New_num) Is Not Null));
    Mais ça ne fonctionne toujours pas, j’obtiens le message "L'opération doit utiliser une requête qui peut être mis a jour."
    Je n'ai pas trouvé d'explication pour mon cas sur le net, la base peut être modifiée, j'ai fait le test avec un update simple.
    Si vous avez une idée!

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 6
    Points
    6
    Par défaut La solution
    Je repost pour vous présenter ma solution.

    Pour la requête d'update

    Requête n°1 nommée [_R Old New doublons]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MIN(Numéro) AS Old_num, MAX(Numéro) AS New_num
    FROM eleves
    WHERE [ID GALIA] IS NOT NULL
    GROUP BY [ID GALIA]
    HAVING COUNT(*)>1;
    Requête n°2 qui crée une table nomée ONI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T.Old_num, T.New_num, E.PrenonNom AS Old_Pn, E.mp AS Old_Mp INTO ONI
    FROM [_R Old New doublons] AS T 
    LEFT JOIN eleves AS E 
    ON T.Old_num = E.Numéro;
    Requête finale (l'update)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE eleves AS EL 
    LEFT JOIN ONI ON EL.Numéro = ONI.New_num 
    SET EL.PrenonNom = ONI.Old_Pn, EL.Mp = ONI.Old_Mp
    WHERE (((ONI.New_num) Is Not Null));
    Pour la requête de suppression

    Requête n°1 nommée [_R2-1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [ID GALIA], MAX(Numéro) AS New_num
    FROM eleves
    WHERE [ID GALIA] IS NOT NULL
    GROUP BY [ID GALIA]
    HAVING COUNT (*) > 1;
    Requete n°2 qui crée une table nommée ONI2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T2.Numéro INTO ONI2
    FROM [_R2-1] AS T 
    LEFT JOIN eleves AS T2 
    ON (T2.[ID GALIA] = T.[ID GALIA]) AND (T2.Numéro <> T.New_num)
    WHERE T2.Numéro IS NOT NULL;
    Requete finale (le delete)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE *
    FROM eleves AS E
    WHERE EXISTS
    (select * from ONI2 where ONI2.Numéro = E.Numéro);
    Bon ça fait ce que je lui demande, j'ai fait une macro pour les exécuter à la suite mais j'ai l'impression qu'il y avait plus simple.


    Ce qui m'a pris peu de temps en SQL "classique" m'a demandé un loooong moment pour access!
    Un peu déçu de ne pas avoir eu plus d'aide ici .

    En espérant que ça serve à d'autres.

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

Discussions similaires

  1. Intégrer un tableau dans une requête mysql
    Par GarGamel55 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/02/2006, 19h16
  2. Exportation d'une bd mysql vers un format csv
    Par derric8016 dans le forum Outils
    Réponses: 5
    Dernier message: 13/01/2006, 21h58
  3. Comment traduire une requête en XPATH ?
    Par vincent1 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/06/2005, 12h46
  4. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  5. Réponses: 7
    Dernier message: 03/06/2004, 12h46

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