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 PostgreSQL Discussion :

UPDATE avec plusieurs tables


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut UPDATE avec plusieurs tables
    Salut a tous,

    Voici mes 2 tables:
    tbl_payements:
    fld_id
    fld_status
    ...

    tbl_historique_payements:
    fld_id
    fld_payement_id
    fld_commentaire
    ...
    Comme vous pouvez le constater la second table sert a sauvegarder les differentes actions faites sur un payement. Donc il peut y avoir plusieurs lignes, de la seconde table, liees a une seule ligne de la 1ere.

    J'aimerais creer une requete qui ,pour chaque payement, copierait dans le champs fld_status, le commentaire de l'historique qui a le plus gros fld_id parmi les historiques lies au payement.

    Le probleme c'est que je sais meme pas comment on fait pour assigne la valeur d'un champs d'une table B a un champs d'une table A
    Peut-etre un fld1 = (SELECT fld2 FROM ...). Mais j'y arrive pas avec ma requete

    Merci d'avance pour votre aide!

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    J'aimerais creer une requete qui ,pour chaque payement, copierait dans le champs fld_status, le commentaire de l'historique qui a le plus gros fld_id parmi les historiques lies au payement.
    Ne serait-ce pas plutôt la valeur de fld_payement_id la plus élevée ?

    Si tel est le cas, essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH
    	CTE_DERNIER_COMMENTAIRE AS
    	(
    		SELECT fld_id, MAX(fld_payement_id) AS max_fld_payement_id
    		FROM tbl_historique_payements
    	)
    UPDATE tbl_payements
    SET fld_status = HP.fld_commentaire
    FROM tbl_payements AS P
    JOIN tbl_historique_payements AS HP
    	ON P.fld_id = HP.fld_id
    JOIN CTE_DERNIER_COMMENTAIRE AS CDC
    	ON HP.fld_id = DCDC.fld_id
    	AND HP.fld_payement_id = CDC.max_fld_payement_id
    @++

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Ne serait-ce pas plutôt la valeur de fld_payement_id la plus élevée ?
    Non je voudrais selectionner le plus grand ID de l'historique parce que je veux le dernier (le plus recent). Parce qu'en fait j'enregistre pas la date.

    Donc par example si j'ai:
    tbl_payements
    fld_id = 22, fld_status = 'blabla'
    fld_id = 26, fld_status = 'rien'
    ...

    tbl_historique_payements
    fld_id = 8, fld_payement_id = 26, fld_commentaire = 'Creation du payement'
    fld_id = 15, fld_payement_id = 26, fld_commentaire = '1er payement'
    fld_id = 18, fld_payement_id = 22, fld_commentaire = 'En cours'
    fld_id = 19, fld_payement_id = 26, fld_commentaire = 'Dernier payement'
    fld_id = 20, fld_payement_id = 22, fld_commentaire = 'Termine'
    Apres l'execution de la requete j'aimerais obtenir:
    tbl_payements
    fld_id = 22, fld_status = 'Termine'
    fld_id = 26, fld_status = 'Dernier payement'

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    J'ai essaye d'adapter la requete que vous m'avez donne. Voici le resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH
    	CTE_DERNIER_COMMENTAIRE AS
    	(
    		SELECT MAX(fld_id), fld_payement_id AS max_historique_id
    		FROM tbl_historique_payements
    	)
    UPDATE tbl_payements
    SET fld_status = HP.fld_commentaire
    FROM tbl_payements AS P
    JOIN tbl_historique_payements AS HP
    	ON P.fld_id = HP.fld_payement_id
    JOIN CTE_DERNIER_COMMENTAIRE AS CDC
    	ON HP.fld_id = CDC.max_historique_id
    	AND HP.fld_payement_id = CDC.fld_payement_id
    Je sais pas si c'est bien ca. Maintenant je vais la tester.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Je viens d'essayer ma requete mais j'obtiens directement une erreur sur le "WITH"
    ERROR: syntax error at or near "WITH
    J'utilise PostgreSQL v8.3.

    EDIT: Apparemment la version 8.3 ne supporte pas "WITH"
    Y-a-t-il un equivalent?

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Effectivement WITH n'est supporté qu'à partir de 8.4, mais ici on peut s'en passer facilement, il me semble qu'une version de la requête qui fait l'affaire ressemble à ça (à vérifier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE tbl_payements AS P
    FROM (select fld_payement_id, max(fld_id) AS max_id FROM tbl_historique_payements GROUP BY fld_payement_id) mx, tbl_historique_payements HP
    SET p.fld_status = HP.fld_commentaire
    WHERE HP.fld_id=mx.max_id
    AND P.fld_id=HP.fld_payement_id
    Il doit même être possible d'éliminer une jointure avec tbl_historique_payements en utilisant le SELECT DISTINCT ON qui est spécifique PostgreSQL, si besoin est.

Discussions similaires

  1. [UPDATE] Faire un update avec plusieurs tables
    Par Fuzo13 dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/10/2012, 11h37
  2. [1.x] UPDATE avec plusieurs tables
    Par agrel dans le forum Symfony
    Réponses: 1
    Dernier message: 06/05/2010, 16h10
  3. Réponses: 3
    Dernier message: 04/06/2009, 15h49
  4. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  5. Tquery - update avec 2 tables
    Par spocksb dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/08/2004, 08h39

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