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

Langage SQL Discussion :

Update difficile à cause d'une sous-requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 32
    Points
    32
    Par défaut Update difficile à cause d'une sous-requête
    Bonjour,

    Je dois mettre à jour une table (oecpt) à partir d'une autre table temporaire (imp_od).
    La table imp_od contient 2 colonnes (champ1, compte) et la table oecpt contient aussi 2 colonnes (numoecpt, regoecpt).
    Dans la table oecpt, il y a certaines lignes à mettre à jour, mais pas toutes. Ces lignes sont celles représentées par la table imp_od.
    Autrement dit, la table imp_od contient les nouvelles valeurs des lignes de la table oecpt.
    champ1 correspond au numoecpt (le numéro de la ligne ou clé primaire).
    compte correspond à la nouvelle valeur de regoecpt.

    Donc, je dois modifier les valeurs de reoecpt par compte, en sachant que seules les lignes dont le numoecpt possède un compte seront mises à jour.

    J'ai écrit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE oecpt
    SET regoecpt = (select compte from imp_od where numoecpt=champ1)
    WHERE numoecpt IN (select champ1 from imp_od);
    Cela donne un message d'erreur disant que la sous-requête de SET regoecpt = (select compte from imp_od where numoecpt=champ1) ne doit retourner qu'une seule valeur.

    Pourriez-vous, s'il vous plaît, m'aider ?

  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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Tu peux utiliser une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE oecpt o
    INNER JOIN imp_od i ON o.numoecpt = i.champ1
    SET regoecpt = i.compte

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tu peux utiliser une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE oecpt o
    INNER JOIN imp_od i ON o.numoecpt = i.champ1
    SET regoecpt = i.compte
    Cette syntaxe n'est pas conforme à la norme SQL et ne sera donc pas prise en charge par tous les SGBD.
    Davesique ne nous a malheureusement pas précisé le SGBD qu'il utilisait...

    Toutefois, si la sous-requête retourne plusieurs valeurs, l'utilisation de UPDATE..JOIN ne résoudra rien. Le SGBD ne saura pas plus déterminer laquelle des multiples valeurs retournées utiliser pour mettre à jour la ligne traitée

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 32
    Points
    32
    Par défaut
    Bonjour,
    Merci pour vos première réponses.
    Le SGBD que j'utilise est Oracle.
    J'exécute mes scripts sql sous sql plus.

    En effet la sous-requête retourne plusieurs, or il faudrait qu'elle n'en retourne qu'une seule.

    Comment faire ?

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Ajouter l'extension BdC à Oracle ?
    Toutefois, elle est surtout orientée décsionnel, assez chère et pas toujours fiable... (BdC : boule de cristal)

    La seule solution viable est d'avoir une sous-requête qui retourne une seule valeur : la bonne.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 32
    Points
    32
    Par défaut
    Quelle pourrait être cette sous-requête qui retourne une seule valeur ?

    Sinon, y a-t-il moyen de faire autrement qu'un update ?

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Si tu veux mettre à jour... tu seras sûrement obligé de faire un update.
    (bon tu peux tenter d'éditer les fichiers de base de données avec notepad ou vi, mais tu risques de pas avoir les droits )

    Il est facile de modifier la requête pour qu'elle prenne une ligne aléatoire en cas de doublons... mais c'est dangereux !
    En fait, tu dois te poser la question à toi même : pourquoi tu as plusieurs lignes ?
    Si on choisi arbitrairement un de ces résultats, il risque d'être faux, non ?

    Si tu t'en fous, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE oecpt
    SET regoecpt = (SELECT compte FROM imp_od WHERE numoecpt=champ1 AND ROWNUM = 1)
    WHERE numoecpt IN (SELECT champ1 FROM imp_od);

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    Autrement dit, la table imp_od contient les nouvelles valeurs des lignes de la table oecpt.
    champ1 correspond au numoecpt (le numéro de la ligne ou clé primaire).
    compte correspond à la nouvelle valeur de regoecpt.
    Ce que je comprends pas comment il peut te renvoyer plusieurs lignes alors que champ1 et une cle primaire.
    Si tu nous donne un exemple de données des deux tables, peut être nous pourrions t'aider.

    A+

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE oecpt
    SET    regoecpt = T.compte
    WHERE  numoecpt IN (SELECT champ1 
                        FROM   imp_od AS T);
    Cela devrait être la seule chose à faire conformément à la norme SQL !

    A +

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 32
    Points
    32
    Par défaut
    Merci.

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Je relance ce sujet car j'ai un probleme similaire.

    J'ai une requete de selection avec jointure entre deux table (A et B) qui me retourne un ensemble d'enregistrement. Je souhaiterais faire un update sur l'ensemble de ces enregistrements mais je ne vois pas comment réaliser la jointure entre l'update et le select car ma table d'update a plusieurs clé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE TABLE_0
    SET VAL = 'TOTO'
    WHERE CLE1 = ???
    AND CLE2 = ??
     
    SELECT A.CLE1 , A.CLE2 
    FROM TABLE_0 A, TABLE_1 B
    WHERE A.VAL1 = B.VAL2
    AND A.VAL2='TITI'
    Merci pour votre aide

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184

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

Discussions similaires

  1. [AC-2010] Requête Update sur le résultat d'une sous-requête
    Par curt dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 06/07/2013, 21h40
  2. Une sous-requête avec NOT IN qui me cause du souci
    Par annedeblois dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 14h56
  3. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50
  4. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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