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 alias non reconnu?!


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 alias non reconnu?!
    Salut a tous,

    J'essaye de faire marcher un UPDATE utilisant un alias. Mais j'obtiens l'erreur suivante:
    ERROR: column "p" of relation "tbl_proposals" does not exist
    LINE 2: SET P.fld_proposal_value = HP.fld_proposal_value
    ^

    ********** Error **********

    ERROR: column "p" of relation "tbl_proposals" does not exist
    SQL state: 42703
    Character: 31
    Voici la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE tbl_proposals AS P
    SET P.fld_proposal_value = HP.fld_proposal_value
    FROM (SELECT fld_proposal_id, max(fld_id) AS max_id 
          FROM tbl_proposals_history 
          GROUP BY fld_proposal_id) AS mx, 
         tbl_proposals_history AS HP
    WHERE HP.fld_id=mx.max_id
    	AND P.fld_id=HP.fld_proposal_id 
    	AND (P.fld_proposal_value IS NULL OR P.fld_proposal_value = 0)
    	AND (P.fld_status = 'Issued' OR P.fld_status ='On Hold' OR P.fld_status = 'Won' OR P.fld_status = 'Lost' OR P.fld_status = 'Dead')
    	AND HP.fld_proposal_value IS NOT NULL
    J'utilise PostgreSQL 8.3

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Sous PostgreSQL, on ne peut pas mettre d'alias à la table qu'on souhaite mettre à jour. Les alias, en revanche, peuvent sur mettre sur les tables dans la clause FROM de l'update.

    Il faut donc, dans la clause WHERE, que tu remplaces tous les "P" par "tbl_proposals".

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  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
    C'est ce que je m'etais dit, mais je suis alle voir la doc de PostgreSQL 8.3 et voila ce que j'y ai trouve:
    UPDATE [ ONLY ] table [ [ AS ] alias ]
    SET { column = { expression | DEFAULT } |
    ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
    [ FROM fromlist ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ AS output_name ] [, ...] ]
    Source

    Bref, j'ai remplace mon alias et maintenant ca marche!

    Requete finale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE tbl_proposals
    SET fld_proposal_value = HP.fld_proposal_value
    FROM (SELECT fld_proposal_id, max(fld_id) AS max_id 
          FROM tbl_proposals_history 
          GROUP BY fld_proposal_id) AS mx, 
         tbl_proposals_history AS HP
    WHERE HP.fld_id=mx.max_id
    	AND tbl_proposals.fld_id=HP.fld_proposal_id 
    	AND (tbl_proposals.fld_proposal_value IS NULL OR tbl_proposals.fld_proposal_value = 0)
    	AND (tbl_proposals.fld_status = 'Issued' OR tbl_proposals.fld_status ='On Hold' OR tbl_proposals.fld_status = 'Won' OR tbl_proposals.fld_status = 'Lost' OR tbl_proposals.fld_status = 'Dead')
    	AND HP.fld_proposal_value IS NOT NULL
    Merci

  4. #4
    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
    C'est dans la clause SET que l'alias n'est pas autorisé pour les colonnes de la table qui doit être mise à jour.
    C.a.d qu'il faut faire SET colonne=... par opposition à SET alias.colonne=...
    Pour le reste de la requête, l'alias peut être utilisé normalement.

  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
    En effet. Je viens de tester cela et ca marche!
    Le nouvelle requette:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE tbl_proposals AS P
    SET fld_proposal_value = HP.fld_proposal_value
    FROM (SELECT fld_proposal_id, max(fld_id) AS max_id 
          FROM tbl_proposals_history 
          GROUP BY fld_proposal_id) AS mx, 
         tbl_proposals_history AS HP
    WHERE HP.fld_id=mx.max_id
    	AND P.fld_id=HP.fld_proposal_id 
    	AND (P.fld_proposal_value IS NULL OR P.fld_proposal_value = 0)
    	AND (P.fld_status = 'Issued' OR P.fld_status ='On Hold' OR P.fld_status = 'Won' OR P.fld_status = 'Lost' OR P.fld_status = 'Dead')
    	AND HP.fld_proposal_value IS NOT NULL
    Merci pour les explications

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

Discussions similaires

  1. Update avec alias et jointure
    Par olibara dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 26/03/2011, 18h00
  2. UPDATE avec alias
    Par MinsK dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/10/2009, 14h45
  3. [Tables Access] Problème avec AUTO_INCREMENT non reconnu
    Par GuixInDaMixx dans le forum VB.NET
    Réponses: 4
    Dernier message: 15/05/2008, 18h01
  4. Alias non reconnu
    Par Requin15 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/06/2006, 15h20

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