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 imbriqué avec un SELECT


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Points : 83
    Points
    83
    Par défaut Update imbriqué avec un SELECT
    Bonjour,
    Je voudrais à l'aide d'une requête, mettre à jour les données d'une table pas l’intermédiaire d'une autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Table_a :
    id_A
    nom
    prenom
    Exemple : 1,toto,titi / 2, martin, philippe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    table_b :
    id_B
    nom
    prenom
    Exemple : martin,philippe / toto, titi
    Maintenant mon but est de mettre à jour l'id_B en recuperant les valeurs sur la table A et ayant le meme prenom et le meme nom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE table_b set id_B = x.id_A FROM (select id_A FROM table_a WHERE table_a.nom = table_b.nom AND table_a.prenom = table_b.prenom) x
    Cependant, ca ne fonctionne pas (la relation "table_a" n'existe pas).

    Avez vous une idée ?
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Quelle est votre erreur en fait ?

    Sinon, qu'allez-vous faire en cas de doublon ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Points : 83
    Points
    83
    Par défaut
    L'erreur est la suivante :
    la relation "table_a" n'existe pas

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Pouvez-vous poster le script de création exact de la table_a ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Points : 83
    Points
    83
    Par défaut
    Voila :
    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
    19
    20
    21
    22
     
    CREATE TABLE table_a
    (
      id_a serial NOT NULL,
      nom character varying(10),
      prenom character varying(80),
      CONSTRAINT table_a_pkey PRIMARY KEY (id_a ),
      CONSTRAINT table_a_nom_key UNIQUE (nom , prenom )
    )
     
    CREATE INDEX table_ac_nom_prenom_index
      ON table_a
      USING btree
      (nom , prenom );
     
     
    CREATE TABLE table_b
    (
      id_b integer,
      nom character varying(10),
      prenom character varying(80)
    )

  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
    table_a qui n'existe pas, c'est peut-être qu'elle a été créée avec des majuscules et implicitement des guillemets autour (problème récurrent avec pgadmin et l'usage des majuscules)

    Mais par ailleurs l'update corrélé est mal écrit. Ce serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table_b SET id_B = id_A FROM table_a WHERE table_a.nom = table_b.nom AND table_a.prenom = table_b.prenom;

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    oki bon,

    j'ai un gros doute avec votre syntaxe d'update.
    En v9.1 celle-ci plante et ca me parait logique.

    Vous n'aurez pas de problème de doublon dû à votre contrainte d'unicité (mais pour moi c'est contrainte est incohérente).

    Je ne comprend pas non plus le but de votre démarche vu que vous risquez d'avoir des problème de duplication de primary key dans la table_b, et encore pire si vous utilisez aussi un serial pour la pk de la table_b.

    Bref, essayez avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update table_b b set idb = (select ida from table_a a where a.nom = b.nom and table_a.prenom = table_b.prenom) 
    where exists (select 1 from table_a a where a.nom = b.nom and table_a.prenom = table_b.prenom);
    edit : attention estofilo au risque d'update de idB avec des valeurs null vu qu'aucune restriction n'est faites

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par estofilo Voir le message
    table_a qui n'existe pas, c'est peut-être qu'elle a été créée avec des majuscules et implicitement des guillemets autour (problème récurrent avec pgadmin et l'usage des majuscules)

    Mais par ailleurs l'update corrélé est mal écrit. Ce serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table_b SET id_B = id_A FROM table_a WHERE table_a.nom = table_b.nom AND table_a.prenom = table_b.prenom;
    Grand merci à vous !
    Grâce a vous j'ai appris la bonne structure à utiliser et vous m'avez montré mon erreur !

    Merci !

  9. #9
    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
    Citation Envoyé par johnson95 Voir le message
    Voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE table_a
    (
      id_a serial NOT NULL,
      nom character varying(10),
      prenom character varying(80),
      CONSTRAINT table_a_pkey PRIMARY KEY (id_a ),
      CONSTRAINT table_a_nom_key UNIQUE (nom , prenom )
    )
     
    CREATE INDEX table_ac_nom_prenom_index
      ON table_a
      USING btree
      (nom , prenom );
    Une remarque là-dessus, dans le code ci-dessus le CREATE INDEX est à supprimer car le CREATE TABLE aura créé déjà implicitement un index unique sur (nom,prenom) du fait de la contrainte table_a_nom_key
    Ce genre de création implicite est mentionnée sous la forme de "NOTICE" en retour du CREATE TABLE. Je ne sais pas si pgadmin les affiche par défaut (psql le fait en tout cas).

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Points : 83
    Points
    83
    Par défaut
    Merci !

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

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. [Mysql 3.23] Un UPDATE avec un SELECT
    Par griese dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/12/2006, 09h09
  3. on duplicate key avec un select au lieu d'update ?
    Par pony dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/10/2006, 15h05
  4. [PLSQL] select imbriqué avec clause (+)
    Par pullin dans le forum Oracle
    Réponses: 4
    Dernier message: 03/05/2006, 11h07
  5. [ SQL ] Faire un update avec un select imbriqué
    Par zozolh2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2005, 12h05

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