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 :

[Requête/SQL]Mise à jour avec condition


Sujet :

Requêtes et SQL.

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 216
    Par défaut [Requête/SQL]Mise à jour avec condition
    J’ai encore un problème :
    La table A alimente la table B. Lors de l’import quotidien des données d’une table à l’autre, comment faire pour que la requete n’apporte que les nouvelles données et n’efface pas les anciennes.
    Par exemple, il faudrait une formule : « si données n’est pas dans la liste, la rajouter, sinon ne rien faire)
    De facon à ne pas obtenir 2 fois la même données
    Est il possible de faire cela sans programmation ?

  2. #2
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    En te basant sur la clé des tables, tu peux identifier ce qui sont absents de la table destination en jouant notamment sur le type de jointure dans une requete ajout...

    Quelque chose du genre:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO TableDestination (LaClé, MonChamp2....)
    SELECT DISTINCTROW TableSource.LaClé,TableSource.Champ2,...
    FROM TableSource Left Join TableDestination On TableSource.LaClé = TableDestination.LaClé
    WHERE TableDestination.LaClé Is Null

    (Biensur il faut adapter cette requête à ton cas)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 216
    Par défaut
    Et sans requete SQL c'est possible??
    Parce que ce n'est vraiment pas clair pour moi (je débute en accès)

  4. #4
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Notes que toute requête que tu crées dans Access est enregistrée en SQL, même si tu l'élabores à l'aide de la trés efficace et conviviale interface QBE (le "mode création") que propose Access.

    Ce serait long à t'expliquer une à une chacune des composantes de cette requête sans le SQL. Essayes donc de faire un cas simple en t'inspirant de la requête que je t'ai proposée.
    Pour cela crées dans une base de test, une table TableDestination comportant un champ LaClé et un champ Champ2 et une autre table TableSource de même structure.

    Crées ensuite une nouvelle requête. Sans ajouter de table, tu passes en SQL (Affichage / Mode SQL) et tu colles la reuête ci-dessous.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO TableDestination (LaClé, Champ2)
    SELECT DISTINCTROW TableSource.LaClé,TableSource.Champ2
    FROM TableSource LEFT JOIN TableDestination ON TableSource.LaClé = TableDestination.LaClé
    WHERE TableDestination.LaClé IS NULL

    Repasses alors en mode Création et étudies l'architecture de cette requête.


    Bon courage

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 216
    Par défaut
    je n y arrive pas... Il n existe pas une autre méthode?

  6. #6
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Sans doute trouveras-tu de quoi mieux comprendre les concepts dont tu as besoin dans les tutos...


    Par exemple, regarde le tuto de Maxence sur les jointures
    http://mhubiche.developpez.com/Acces...ointures/#L3.6


    Bon courage

  7. #7
    Membre Expert Avatar de Renardo
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 648
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 648
    Par défaut
    tu peut eventuelement ajouter 1 champ boleen(Case a cocher)cocher tous les elements exporte et ensuite dans ta requete metre dans le critere du champ boleen Non logiquement il te restera que les enregistrements non exporter.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 216
    Par défaut
    Je galère pas mal avec SQL…. J’ai quand même essayé de suivre les instructions de Mout1234, est ce que ca vous paraît bon ??
    PQ qd je lance la requete ca ne marche…
    J’ai pris [INFOS NHA + TYPE] pour la tableDestination , [Type NHA] pour la clé, [MSN U/S à réparer parent] pour Champ2 et [ENCOURS MOTEURS CLIENTS + TYPE] pour TableSource.
    Je joins aussi mon schéma relationnel…
    INSERT INTO [INFOS NHA + TYPE], ( [MSN U/S à réparer parent],[Type NHA] )
    SELECT DISTINCTROW [ENCOURS MOTEURS CLIENTS + TYPE] . [MSN U/S à réparer parent] , [ENCOURS MOTEURS CLIENTS + TYPE].[Type NHA]
    FROM [ENCOURS MOTEURS CLIENTS + TYPE] LEFT JOIN [INFOS NHA + TYPE] ON [ENCOURS MOTEURS CLIENTS + TYPE].[MSN U/S à réparer parent] = [INFOS NHA + TYPE].[MSN U/S à réparer parent]
    WHERE [INFOS NHA + TYPE].[MSN U/S à réparer parent] IS NULL

    PS : est ce que cette requête peut etre intégrée dans une requête création, à la suite d’une première requête ???
    MERCI pr votre aide !! car je suis complètement bloquée

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 145
    Par défaut
    Salut!
    J'ai regardé et testé le code SQL que tu as donné mout1234. Ca marche apparemment mais je n'arrive pas trop à comprendre le code, ce qu'il donne... peux-tu expliquer un peu ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 216
    Par défaut
    J’ai 2 tables (voir sur schéma relationnel Table INFOS NHA + TYPE et Table ENCOURS MOTEURS CLIENTS + TYPE)

    La Table ENCOURS MOTEURS CLIENTS + TYPE me permet d’alimenter la table INFOS NHA la liste des [MSN U/S à réparer parent]. La table ENCOURS MOTEURS CLIENTS est actualisée tous les jours.
    Donc, il faudrait une requete qui envoie de la Table ENCOURS MOTEURS CLIENTS + TYPE vers la table INFOS NHA seulement les nouveaux [MSN U/S à réparer parent] tout en gardant les anciens enregistrements de la table INFOS NHA + TYPE
    Est ce un peu plus clair ?

  11. #11
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Citation Envoyé par atlantideD
    INSERT INTO [INFOS NHA + TYPE], ( [MSN U/S à réparer parent],[Type NHA] )
    SELECT DISTINCTROW [ENCOURS MOTEURS CLIENTS + TYPE] . [MSN U/S à réparer parent] , [ENCOURS MOTEURS CLIENTS + TYPE].[Type NHA]
    FROM [ENCOURS MOTEURS CLIENTS + TYPE] LEFT JOIN [INFOS NHA + TYPE] ON [ENCOURS MOTEURS CLIENTS + TYPE].[MSN U/S à réparer parent] = [INFOS NHA + TYPE].[MSN U/S à réparer parent]
    WHERE [INFOS NHA + TYPE].[MSN U/S à réparer parent] IS NULL
    Bonsoir,

    Je viens de regarder ta requête et ton schéma, cela me semble bon. C'est où que ça coince ? il te mets un message d'erreur? Cela ne donne pas le résultat que tu attendais?


    Citation Envoyé par Melhiril
    Salut!
    J'ai regardé et testé le code SQL que tu as donné mout1234. Ca marche apparemment mais je n'arrive pas trop à comprendre le code, ce qu'il donne... peux-tu expliquer un peu ?
    Ok détaillons un peu:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO TableDestination (LaClé, Champ2)
    SELECT DISTINCTROW TableSource.LaClé,TableSource.Champ2
    FROM TableSource LEFT JOIN TableDestination ON TableSource.LaClé = TableDestination.LaClé
    WHERE TableDestination.LaClé IS NULL

    Le but étant de trouver les éléments de la table TableSource absents de la table TableDestination
    il faut d'abord jouer sur la nature de la jointure.
    En effet, une jointure classique (INNER JOIN) entre les tables éliminerait de la requête les lignes sans correspondances (c'est justement celles qui nous interesse).
    Le LEFT JOIN permet d'afficher toutes les lignes de la table source, y compris celles pour lesquelles il n'y a pas de correspondance dans la table destination.

    Maintenant que l'on a bien toutes les lignes qui nous sont utiles, il s'agit de ne garder que celles-ci en éliminant celles qui sont présentes dans les deux tables. Pour cela on a le WHERE TableDestination.LaClé Is Null qui ne garde donc que les enregistrements pour lesquels il n'y a pas de données correspondantes dans la table TableDestination.


    Enfin le INSERT INTO se charge d'insérer ces données dans la table TableDestination.



    Citation Envoyé par atlantideD
    est ce que cette requête peut etre intégrée dans une requête création, à la suite d’une première requête ???
    Je suis pas sur de bien comprendre mais ... tu peux décomposer ta requête en plusieurs étapes pour y voir plus clair. Une première requête (un SELECT) qui se charge d'identifier les nouvelles données. Une seconde qui utilise la précédente comme source pour faire un ajout.

    Bon courage

Discussions similaires

  1. [requête sql] Mise à jour si non renseigné
    Par jeanphi45 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 12/10/2011, 16h13
  2. [AC-97] mise à jour avec conditions
    Par burolec dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/03/2011, 18h06
  3. [AC-2002] requête de mise à jour avec code VBA
    Par sylvie dans le forum VBA Access
    Réponses: 5
    Dernier message: 26/05/2010, 14h56
  4. [AC-2003] Requête mise à jour avec condition IN
    Par buzz73 dans le forum VBA Access
    Réponses: 19
    Dernier message: 30/07/2009, 13h03
  5. [Requête/SQL]Mise à jour table sans supprimer les relations
    Par atlantideD dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/04/2007, 15h53

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