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

Firebird Discussion :

Requête Update avec 3 tables et jointures


Sujet :

Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 572
    Par défaut Requête Update avec 3 tables et jointures
    Bonjour,

    je souhaite mettre à jour un champ (FIELD1) de la table TABLE1
    avec une REQUETE DIRECTE.

    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
     
    UPDATE
      TABLE1
     
    SET
      TABLE1.FIELD1 = '1'
     
    WHERE
     
      EXISTS
      (SELECT EXPL.CHP
      FROM EXPL, PAC, TABLE1
     
      WHERE EXPL.CHP IS NOT NULL              // condition principale
     
      AND PAC.NEW_REF = TABLE1.REF 
      AND PAC.COMM = TABLE1.COMM_SURF 
      AND PAC.NOP = EXPL.NPA)
    La requête s'exécute mais elle ne fait rien.
    Ma table TABLE1 contient 1 329 695 enregistrements et
    292292 d'entre eux devraient se mettre à jour..

    la condition WHERE EXPL.CHP IS NOT NULL ne fonctionne pas.

    merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 596
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    un peu de normalisation dans la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE
      TABLE1
     SET
      TABLE1.FIELD1 = '1'
     WHERE
       EXISTS
      (SELECT 1      
      FROM EXPL  E JOIN  PAC P ON P.NOP = E.NPA
                         JOIN TABLE1 T ON P.NEW_REF = T.REF  AND P.COMM = T.COMM_SURF 
       WHERE E.CHP IS NOT NULL              // condition principale
     )
    et déjà vérifier le type de jointure <INNER> JOIN , LEFT <OUTER>JOIN ? et puis le WHERE ne me semble pas clair du coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE P.NEWREF=TABLE1.REF  // là c'est le table1 de l'update
                 AND E.CHP IS NOT NULL
    peut-être

  3. #3
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    A vue de nez je dirais qu'au mieux ça met '1' dans tous les Field1 de table1...


    Et sinon en normalisant la requête et en n'utilisant pas table1 de nouveau dans le select (ce qui est très ambigu je trouve)


    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
    UPDATE
      TABLE1 t
     
    SET
      t.FIELD1 = '1'
     
    WHERE
     
      EXISTS
      (SELECT 0
      FROM EXPL e
      inner join PAC p on p.NOP=e.NPA
      WHERE e.CHP IS NOT NULL              // condition principale
      AND p.NEW_REF = t.REF 
      AND p.COMM = t.COMM_SURF 
    )

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 596
    Billets dans le blog
    65
    Par défaut
    J'ai toujours été mal à l'aise avec ces UPDATE de colonne à partir d'une autre table

  5. #5
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    J'ai toujours été mal à l'aise avec ces UPDATE de colonne à partir d'une autre table
    Moi aussi, j'ai pris l'habitude de faire des procédures.

  6. #6
    Membre éclairé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 572
    Par défaut Requête UPDATE
    Bonjour,

    @Barbibulle
    j'ai testé la requête avec
    les vrais noms de tables et de champs pour me faciliter la tâche..
    (je suis sur un projet agricole..)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    UPDATE
      SURFACE t
    SET
      t.PRESENCE_EXPLOITANT = '1'
    WHERE
      EXISTS
      (SELECT 0
      FROM EXPLOITANT e
      inner join PACAGE p on p.NOPACAGE=e.PACAGE
      WHERE e.NOM IS NOT NULL              
      AND p.NEW_REF_CADAST = t.REFERENCE_CADASTRALE 
      AND p.COMMUNE_PACAGE = t.COMMUNE_SURFACE)
    Elle tourne, mais la barre de progression n'avance pas..
    Comme les tables sont grosses, j'ai quand même laissé tourner un quart d'heure pour voir.
    Puis, j'ai shunté l'éditeur.
    mais dans la table surface, dans le champ presence_exploitant aucun enregistrement n'a été mis à 1.

    Pour info, si je fais une requête SELECT comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 
      PACAGE.NOPACAGE,
      PACAGE.NEW_REF_CADAST,
      EXPLOITANT.NOM,
      SURFACE.SOUS_GROUPE_NATURE_CULT_SURF
    FROM
      PACAGE
      INNER JOIN EXPLOITANT ON (PACAGE.NOPACAGE = EXPLOITANT.PACAGE)
      INNER JOIN SURFACE ON (PACAGE.COMMUNE_PACAGE = SURFACE.COMMUNE_SURFACE)
      AND (PACAGE.NEW_REF_CADAST = SURFACE.REFERENCE_CADASTRALE)
    WHERE
      EXPLOITANT.NOM IS NOT NULL;
    Elle me sort les bonnes données mais mon objectif est
    de stocker l'information dans la table Surface.

    Bien sûr, je pourrais écrire un peu de code avec des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    While not MaTable.Eof do
    begin
    ////
    MaTable.Next;
    end;
    mais, cela n'utilise pas les index et donc, ça devrait prendre beaucoup de temps..

    Il faudrait quelque chose qui marche et qui soit le plus rapide possible

    Pourquoi pas une procédure stockée après tout ?
    bien qu'ici, je n'ai besoin que ponctuellement de cette mise à jour.

    merci de votre aide

    cantador

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

Discussions similaires

  1. Requete update avec addition de 2 champs de 2 tables differentes
    Par Bubulle232 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/05/2014, 21h53
  2. Requete update avec sous requete et max en jointure
    Par youyoupapayou dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/08/2009, 16h19
  3. Réponses: 3
    Dernier message: 04/06/2009, 15h49
  4. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31
  5. Requete Update avec sous requete et jointure
    Par javaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2007, 11h03

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