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

SQL Oracle Discussion :

UPDATE avec le resultat d'un SELECT


Sujet :

SQL Oracle

  1. #1
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut UPDATE avec le resultat d'un SELECT
    Bonjour,

    Je suis sous Oracle 9i, et je voudrais bien savoir si je peux faire un UPDATE d'un champ en utilisant le résultat d'un SELECT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE Table t SET t.nom = CONACT('TEST',SELECT p.nom FROM Personne p where p.ID='9965');
    Pour info : ce genre de requête ne marche pas sous Oracle 9i, est ce que vous pouvez m'aider et m'orienter afin de réaliser ce genre de traitement ?

    Merci beaucoup.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si c'est strictement cette requête que vous avez essayée, il y a peut-être un problème avec le mot-clé CONACT, comme le souligne l'éditeur qui ne met pas ce mot en bleu parce qu'il ne l'interprète pas comme du SQL.

    Je crois comprendre qu'il s'agit de CONCAT ?
    Cette instruction existe t-elle sous Oracle ? Ce n'est pas un mot du langage SQL standard.

    Sinon dans le principe, oui en SQL on peut utiliser un SELECT dans un UPDATE.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Merci pour votre retour,

    Dans le cas de la concaténation, comment dois-je procéder ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a plusieurs erreurs dans votre requête :
    1. On écrit juste UPDATE, pas UPDATE TABLE.
    2. Votre id de la table personne est très certainement numérique, vous n'avez pas besoin de quotes.
    3. Vous ne faites pas de jointure entre la table T et la table PERSONNE : cela signifie que vous allez mettre à jour toutes les lignes de la table T.
    4. L'opérateur de concaténation est la double barre verticale : || (AltGr+6).

  5. #5
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    On écrit juste UPDATE, pas UPDATE TABLE => Dans l'exemple donné, la table a comme nom TABLE, comme vous le constatez, j'ai donné un alias a la TABLE Table qui le 't'

    Votre id de la table personne est très certainement numérique, vous n'avez pas besoin de quotes. => C'est juste un exemple

    Vous ne faites pas de jointure entre la table T et la table PERSONNE : cela signifie que vous allez mettre à jour toutes les lignes de la table T. => Effectivement, je veux mettre à jour toute la table

    L'opérateur de concaténation est la double barre verticale : || (AltGr+6) => Merci beaucoup,

    Par contre j'ai une erreur : missing exception dans le SELECT dans le deux exemples suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    UPDATE test t SET t.nom ='TEST' || SELECT p.nom FROM personne p WHERE p.prenom= 'Test';
     
     
    UPDATE test t SET t.nom = SELECT p.nom FROM personne p WHERE p.prenom= 'Test';

    Est ce que vous avez une idée de la source de l'erreur ?

    Merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je ne sais pas si l'erreur est là mais je mettrais la sous-requête SELECT entre parenthèses sinon il peut interpréter le WHERE comme étant la restriction sur les lignes à mettre à jour avec la requête UPDATE.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    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
    WITH t AS (
    SELECT 1 AS id,'id1' AS libelle, NULL AS pere FROM dual union ALL
    SELECT 2 ,'id2' , 1 FROM dual union ALL
    SELECT 3 ,'id2b' , 1 FROM dual union ALL
    SELECT 4 ,'id4' , NULL FROM dual
    )
    select * from t
    where libelle = select libelle from t where libelle = 'id2'
     
    ORA-00936: missing expression
     
    WITH t AS (
    SELECT 1 AS id,'id1' AS libelle, NULL AS pere FROM dual union ALL
    SELECT 2 ,'id2' , 1 FROM dual union ALL
    SELECT 3 ,'id2b' , 1 FROM dual union ALL
    SELECT 4 ,'id4' , NULL FROM dual
    )
    select * from t
    where libelle = (select libelle from t where libelle = 'id2')
    Je ne comprends pas la premiere requete

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Apres reflexion je comprends votre premiere requete!

    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 TEST
    (TEST_PK NUMBER(10,3),
    LIBELLE VARCHAR2(1024)
    );
     
    CREATE SEQUENCE INIT START WITH 1 INCREMENT BY 1;
     
    INSERT INTO TEST
    SELECT INIT.nextval,dbms_random.string('A',12) FROM DUAL
    connect by level <15
     
    update TEST set
    libelle =
    (
    WITH t AS
    (
    SELECT 1 AS id,'durand' AS nom,'paul' as prenom FROM dual union ALL
    SELECT 2 ,'dufour' , 'tony' FROM dual
    )
    select prenom||' '||nom from t where id = 1
    )
    Cette requette devrait faire ce que vous voulez

  9. #9
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Votre explication CinePhil est logique, ça marche avec les parenthèse, merci beaucoup.

    Merci boutade80 pour votre participation, par contre je ne comprend pas pourquoi vous avez mis les 2 blocs avant l'update, est ce que tu peux m'explique ?

    Merci

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE SEQUENCE INIT START WITH 1 INCREMENT BY 1;
     
    INSERT INTO TEST
    SELECT INIT.NEXTVAL,dbms_random.string('A',12) FROM DUAL
    connect BY level <15
    C'est juste pour avoir des données à mettre à jour.

Discussions similaires

  1. UPDATE sur le resultat d'un SELECT
    Par vegetossj4 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/01/2015, 17h40
  2. Requete Update avec Select imbriqué: etrange resultat!
    Par corentone dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/08/2007, 15h05
  3. [MySQL] Update avec resultat d'un select
    Par zorba49 dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 22/01/2007, 15h00
  4. Probleme avec le resultat d'un SELECT
    Par gama2ee dans le forum Oracle
    Réponses: 10
    Dernier message: 04/01/2007, 10h12
  5. Effectuer un UPDATE avec la valeur d'un Select
    Par KHELOUIATI dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/10/2006, 11h16

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