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 sous-requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Août 2015
    Messages : 14
    Par défaut Update avec sous-requête
    Bonjour à tous,

    J'essaye de faire une requête de update avec une sous requête imbriquée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      UPDATE Table1 set
      donnee1 = '1'
      where exists (select 1 from Table1 A,
      Table2 B
      where
      table1.id1 = table2.id1
      and table1.id2  = table1.id2
      and table2.id3 = 'x'
    Le problème c'est que cette requête me update tous mes enregistrements donne1 de la table 1 sans tenir compte de la condition de ma sous requête.
    Moi je voudrais qu'il ne me update que les enregistrements pour lequels l'égalité suivante est justifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * from Table1 A,
      Table2 B
      where
      table1.id1 = table2.id1
      and table1.id2  = table1.id2
      and table2.id3 = 'x'
    Merci de votre aide

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Cela veut dire que la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    exists (select 1 from Table1 A,
     Table2 B
     where
     table1.id1 = table2.id1
     and table1.id2 = table1.id2
     and table2.id3 = 'x'
    )
    est valable pour tous les enregistrements de la Table 1. Donc l'erreur se trouve au niveau de cette sous-requête!

  3. #3
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Août 2015
    Messages : 14
    Par défaut Ca veut dire
    J'ai vu que quand je fait la requête suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select count(*) from Table1 A,
     Table2 B
     where
     table1.id1 = table2.id1
     and table1.id2 = table1.id2
     and table2.id3 = 'x'
    J'ai 53 enregistrements de sélectionner
    Par contre quand je veux faire le update de ces 53 enregistrements en faisant la requête suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE Table1 set
     donnee1 = '1'
     where exists (select 1 from Table1 A,
     Table2 B
     where
     table1.id1 = table2.id1
     and table1.id2 = table1.id2
     and table2.id3 = 'x'
    J'update plus les 53 seules enregistrements mais tous les enregistrements de ma table et c'est la mon pb.
    Moi je voudrais updater seulement mes 53 enregistrements qui ont été ramené de mon select count(*)

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    J'ai bien compris votre problème mais je voudrais que vous comprenez votre erreur!
    La requête suivante ramène 3 enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select e.*
      from emp e,
           dept d
     Where e.deptno = d.deptno       
       And d.deptno = 10
    est équivalente avec celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Select e.*
      from emp e
     Where Exists (Select Null
                     From dept d
                    Where e.deptno = d.deptno       
                      And d.deptno = 10
                   )
    Par contre la requête suivante met à jour 14 enregistrement de la table emp ce qui est d'une manière évidente erroné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Update emp e
       set e.sal = 10
     Where Exists (Select e.*
                      from emp e,
                           dept d
                     Where e.deptno = d.deptno       
                       And d.deptno = 10
    	               )
    Pour chaque enregistrement de la table emp il existe au moins un enregistrement (en fait 3) dans le résultat de la sous requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select e.*
                      from emp e,
                           dept d
                     Where e.deptno = d.deptno       
                       And d.deptno = 10
    	               )

  5. #5
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Dans ta sous requête, si je ne me trompe pas, soit tu ne fais pas la jointure correctement, soit tu ne lies pas ta requête principale, je ferai quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     UPDATE Table1 set
      donnee1 = '1'
      where exists (select 1 from Table2 B
      where
      table1.id1 = table2.id1
      and table1.id2  = table1.id2 // Il n'y a pas une erreur ici?
      and table2.id3 = 'x')

  6. #6
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Août 2015
    Messages : 14
    Par défaut En toute franchise, je n'ai rien compris
    Vraiment je n'arrive pas à comprendre mon erreur
    Mnitu, je ne comprend pas ce que tu veux m'expliquer ? Ou du moins, je n'arrive toujours pas à comprendre mon erreur

    Linkin, désolé aussi, mais j'ai pas compris ce que tu voulais me dire !!

    Je vais finir par croire que je suis un demeuré !

    N'oubliez pas que je n'ai pas d'étoile sur mon profil ..... Ca viendra peut-être un jour ... On ne sait jamais.
    En attendant ....J'ai toujours pas compris mon erreur

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Ne vous décourage pas!
    Voilà la requête correcte qui met à jour seulement 3 enregistrements (dans mon exemple). Comparez-la avec l'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Update emp e
       set e.sal = 10
     Where Exists (Select Null
                      from dept d
                     Where e.deptno = d.deptno       
                       And d.deptno = 10
                     )

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

Discussions similaires

  1. Requète UPDATE avec sous-requète dans la même table.
    Par Selenite dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2009, 15h04
  2. Requete UPDATE avec sous-requète
    Par alaingui dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2008, 21h16
  3. UPDATE avec sous requête de sélection avec regroupement
    Par Maxsen dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2008, 11h20
  4. [FB2]Update avec sous requête resultat ?
    Par AuBozon dans le forum SQL
    Réponses: 1
    Dernier message: 29/02/2008, 21h04
  5. Requête Update avec Sous-requête
    Par Yohann_x dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2008, 13h19

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