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 :

[QRY SQL] Copie d'un enregistrement d'une table vers une autre en respectant les critères [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut [QRY SQL] Copie d'un enregistrement d'une table vers une autre en respectant les critères
    Bonjour @ tous,
    Je suis à la recherche d'une solution qui permetrait d'Enregistrer les nouveaux enregistrement de la table T1 vers la T2 par exemple.
    Cet enregistrement est composé de plusieurs champ à envoyer dans la T2 afin de les ré-utiliser plus tard.

    Bien qu'ayant trouvé un exemple pour un champ et étant trés novice dans l'Utilisation d'Access, je n'ai pas pu le réutiliser dans mon application.

    Voici le code SQL qui me semble bon mais le problème est que ce code fonctionne la premiere fois, mais le seconde il me double le nombre d'enregistrement comme si les critères de filtrage pour ajout n'était pas bon!! Je n'y comprend plus rien alors que les conditions sont respectées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO [BD Analyse de risque] ( [Appartient à:], Intitulé, [Date de Création] )
    SELECT [TBL_ Analyse de risque].[Appartient à:], [TBL_ Analyse de risque].Intitulé, [TBL_ Analyse de risque].[Date de Création]
    FROM [BD Analyse de risque].[TBL_ Analyse de risque] [BD Analyse de risque].ID_BD_Analyse_Risque = [TBL_ Analyse de risque].[LI_BD_Table prepa de travail]
    WHERE ((([TBL_ Analyse de risque].[Appartient à:])<>[BD Analyse de risque]![Appartient à:])) OR ((([TBL_ Analyse de risque].[Appartient à:])=[BD Analyse de risque]![Appartient à:]) AND (([TBL_ Analyse de risque].Intitulé)<>[BD Analyse de risque]![Intitulé]));
    Les conditions pour que l'enregistrement soit ajouté à la deuxième table est basé soit:
    -seuleument sur le premier champ;
    -sur le Premier et le second

    Merci d'avance @ tous ce qui prendrons le temps de répondre @ cette question bien nébuleuse pour moi!!

    barbaoulle Bien sûr que j'ai les boulles!!
    Cela fait 2 jours que je cherche en vain!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Une question, pourquoi doubler tes enregistrements quel est l'intérêt d'avoir deux fois les mêmes données ?

    Tu alourdis inutilement ta base.

    Philippe

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci de répondre aussi rapidement.
    Je veux faire cet enregistrement sur une autre structure car cela appartient à une base analyse de risque personnalisé qui peut être réutiliser par la suite dans le Temps sur un autre chantier. Alors que là où je les saisies au moment de la création, elles sont attachées à une chantier spécifique. Je veux que ces analyses de risque puissent être indépendante du chantier sur lequel elles ont été créées.
    J'espère avoir été clair.
    merci d'avance.

    Citation Envoyé par Philippe JOCHMANS Voir le message
    Bonjour

    Une question, pourquoi doubler tes enregistrements quel est l'intérêt d'avoir deux fois les mêmes données ?

    Tu alourdis inutilement ta base.

    Philippe

  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 768
    Points
    7 768
    Par défaut
    Bonjour,

    Je pense que ce que tu veux faire est une requête ajout, basée sur une requête de non correspondance.

    Requête de non correspondance (mode création)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TBL_ Analyse de risque        BD Analyse de risque
    ----------------------        ---------------------
    Appartient à:         ------> Appartient à:
    Intitulé              ------> Intitulé
    Date de Création              Date de Création
    Les flèches représentent la jointure gauche entre les deux tables.
    Tu mets les trois champs de [TBL_ Analyse de risque] sur la grille sous les tables, plus le champ [Appartient à:] de la table [BD Analyse de risque].
    En critère pour ce dernier champ, tu mets Est Null, et tu décoches Afficher.
    Ensuite tu changes le type de la requête en requête Ajout, et tu choisis la table "BD Analyse de risque" comme étant la table où ajouter les données.
    Sous le champ [Appartient à:] de [BD Analyse de risque] tu supprimes le contenu de la cellule "ajouter à".

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO [BD Analyse de risque] ([Appartient à:], Intitulé, [Date de Création])
    SELECT [TBL_ Analyse de risque].[Appartient à:], [TBL_ Analyse de risque].Intitulé, [TBL_ Analyse de risque].[Date de Création]
    FROM   [TBL_ Analyse de risque] LEFT JOIN [BD Analyse de risque] ON [TBL_ Analyse de risque].[Appartient à:] = [BD Analyse de risque].[Appartient à:] AND [TBL_ Analyse de risque].[Intitulé] = [BD Analyse de risque].[Intitulé]
    WHERE  [BD Analyse de risque].[Appartient à:] Is Null
    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Salut LedZeppII et merci


    tu as exactement compris mon problème et je l'ai essayé.
    Cela marche pour les champs dont l'intitulé n'est pas vide, dès que celui ci est vide à chaque nouvelle requette ajout il va me les dupliquer vers cette base alors que les condition semble respectés.

    De plus je ne comprend pas le raisonnemment de cette requette: pourquoi va t tester la valeur null sur la [BD_ANA][apartient à] ?

    Merci pour ta contribution je l'avais déjà lu
    jointure gauche entre les deux tables.


    RE Merci

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Je viens juste de trouver la réponse pour ne pas trop compliquer ma base.
    En fait il faut que je sauvegarde uniquement les prépas qui ont un intitulé.
    >>>> Si il n'y a pas de description, je ne les ajoute pas à ma BD.

    Pièce jointe 53892

    le code devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO [BD Analyse de risque] ( [Appartient à:], Intitulé, [Date de Création] )
    SELECT [TBL_ Analyse de risque].[Appartient à:], [TBL_ Analyse de risque].Intitulé, [TBL_ Analyse de risque].[Date de Création]
    FROM [TBL_ Analyse de risque] LEFT JOIN [BD Analyse de risque] ON ([TBL_ Analyse de risque].[Intitulé] = [BD Analyse de risque].[Intitulé]) AND ([TBL_ Analyse de risque].[Appartient à:] = [BD Analyse de risque].[Appartient à:])
    WHERE ((([TBL_ Analyse de risque].Intitulé) Is Not Null) AND (([BD Analyse de risque].[Appartient à:]) Is Null));
    Ainsi j'ai mes analyses que je peut réutiliser ultérieurement.

    Merci de votre aide et voici ma première discussion sur ce forum qui s'achève!!

  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 768
    Points
    7 768
    Par défaut
    J'avais pas compris que le champ Intitulé pouvait être vide.

    La même requête mais avec un WHERE qui distingue deux cas, selon que le Intitulé est renseigné ou pas.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO [BD Analyse de risque] ( [Appartient à:], Intitulé )
    SELECT [TBL_ Analyse de risque].[Appartient à:], [TBL_ Analyse de risque].Intitulé
    FROM [TBL_ Analyse de risque] LEFT JOIN [BD Analyse de risque] ON ([TBL_ Analyse de risque].Intitulé = [BD Analyse de risque].Intitulé) AND ([TBL_ Analyse de risque].[Appartient à:] = [BD Analyse de risque].[Appartient à:])
    WHERE ((([TBL_ Analyse de risque].Intitulé) Is Not Null) AND (([BD Analyse de risque].[Appartient à:]) Is Null))
       OR ((([TBL_ Analyse de risque].Intitulé) Is Null) AND (Exists (SELECT * FROM [BD Analyse de risque] As SQ1 WHERE SQ1.[Appartient à:]=[TBL_ Analyse de risque].[Appartient à:] And (SQ1.Intitulé) Is Null)=False));

    je ne comprend pas le raisonnemment de cette requette: pourquoi va t tester la valeur null sur la [BD_ANA][apartient à] ?
    Dans une requête avec jointure externe, les champs de la table n'ayant pas de correspondance sont remplacés par Null par le moteur de base de données.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    T1             T2
    Ch1 Ch2 Ch3    Ch1 Ch2 Ch3 
    A   1   a      A   1   x
    A   2   b      A   3   y
    A   3   c      B   1   z
    B   1   d
    B   2   e
    Code requête avec jointure externe gauche : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T1           T2
    ------       ------
    Ch1   ---->  Ch1
    Ch2   ---->  Ch2
    Ch3          Ch3
    Code Enregistrements résultants : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T1.Ch1 T1.Ch2 T1.Ch3 T2.Ch1  T2.Ch2  T2.Ch3
    A      1      a      A       1       x
    A      2      b      Null    Null    Null
    A      3      c      A       3       y
    B      1      d      B       1       z
    B      2      e      Null    Null    Null
    Aux lignes 2 et 5, il n'y a aucun enregistrement de T2 correspondant à T1 selon la jointure exprimée dans la requête.
    Comme il faut bien mettre quelque chose dans le jeu d'enregistrements et que cela ne peut pas venir de T2, le moteur met Null.
    Comme critère de non correspondance, je peut mettre Est Null sur T2.Ch1 ou T2.Ch2.
    Bien sûr cela suppose que Ch1 et Ch2 ne sont jamais nuls.
    Dans la grande majorité des cas, la jointure se fera sur des champs clés, pour lesquels Null est interdit.

    A+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Merci
    Merci pour ces precisions et le temps passé pour rediger ta réponse.
    Ceci m'éclaire vraiment sur le fonctionnement des jointures de non correspondance.

    J'espère que cela servira aussi à d'autre. Je n'y serait pas arrivé seul!!

    @++

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

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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