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 :

[REQUETE][IMBRIQUEE] Bien ou pas bien?


Sujet :

Langage SQL

  1. #1
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut [REQUETE][IMBRIQUEE] Bien ou pas bien?
    Bonjour,


    Je suis en train d'ecrire un batch permettant de faire des mise à jour sur une base de donnée.

    Je dois sélectionner des dossiers selon certains critères. Sur chaque dossier ramené, je dois mettre à jour des champs...

    Est ce que l'utilisation de requetes imbriquées est recommandée?

    c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    update T_MATABLE m set m.MONCHAMP where 'condition de selection'  and exits(select ... from ... where ...);
    Est ce que cette requete vous sembles absurde?

    Merci d'avance,

    @+

    Fabszn

  2. #2
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    bè non je vois pas où il peut y avoir un problème, c'est le but du UPDATE, seulement soit sur de ce que te renvoit ta sous-requête sinon ça risque de foutre un brave bordel dans ta base
    Perso j'aurais fait comme ça en tout cas, c'est le plus simple à mes yeux.

  3. #3
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    entierement d'accord avec trotter

    execute ta sous requete seul poour voir si le résultat renvoyé et bien celui que tu recherche et si oui, a toi les updates!!

  4. #4
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Merci pour ta réponse,

    Citation Envoyé par trotters213

    bè non je vois pas où il peut y avoir un problème, c'est le but du UPDATE, seulement soit sur de ce que te renvoit ta sous-requête sinon ça risque de foutre un brave bordel dans ta base
    Perso j'aurais fait comme ça en tout cas, c'est le plus simple à mes yeux.

    Aussi, quand tu dis qu'il faut faire attention à ce que ramene la sous requete, quelles genre de precaution je dois prendre?

    Merci d'avance,

    @+

    Fabszn

  5. #5
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    entierement d'accord avec trotter

    execute ta sous requete seul poour voir si le résultat renvoyé et bien celui que tu recherche et si oui, a toi les updates!!

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    salut.

    Perso je t'aurai proposé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update T_MATABLE m set m.MONCHAMP = Valeur where 'condition de selection'  and exits(select ... from ... where ...);

  7. #7
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par annedjomo
    salut.

    Perso je t'aurai proposé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update T_MATABLE m set m.MONCHAMP = Valeur where 'condition de selection'  and exits(select ... from ... where ...);
    Oui... j'avais oublier en ecrivant la requete sur le forum la valeur de mis à jour...

    @+

    Fabszn

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par trotters213

    bè non je vois pas où il peut y avoir un problème, c'est le but du UPDATE, seulement soit sur de ce que te renvoit ta sous-requête sinon ça risque de foutre un brave bordel dans ta base
    Perso j'aurais fait comme ça en tout cas, c'est le plus simple à mes yeux.
    j'ajouterai à cela de ne pas oublier de vérifier que ta sus reqûete est bien optimisé ( notamment qu'il a un index dessus ...) afin de ne pas dégrader les preformances de ton update .

  9. #9
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    Citation Envoyé par jaouad
    j'ajouterai à cela de ne pas oublier de vérifier que ta sus reqûete est bien optimisé ( notamment qu'il a un index dessus ...) afin de ne pas dégrader les preformances de ton update .
    +1.
    Sinon ça va ramer comme il faut, tu peux nous la montrer ta requête en entier pour voir.
    Citation Envoyé par fabszn
    Aussi, quand tu dis qu'il faut faire attention à ce que ramene la sous requete, quelles genre de precaution je dois prendre?
    Fais attention qu'elle te renvoit toujours ce que tu veux exactement et non pas faire un test en ce disant "c'est bon", soit sur de ta requête sinon ça va rien faire ou pire, te modifier des champs que tu ne voulais pas touché.

  10. #10
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Voila la 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
     
    update tds_ctu ctus                                            
    	set	ctus.CDDET      = 'NN',                                 
            	ctus.DAMAJ      = sysdate                               
                    where  ctus.ANCAMP 	= ?1                                    
                    and    ctus.NUMSESSION = ?2                                    
                    and    ctus.CDSUI 		= 'RE'                          
                    and    ctus.CDDET 		= 'CL'                          
                    and    ctus.CODREC 	= '6'                                   
                    and    not exists (select * from   td_pst pst_           
                            	where  pst_.ANCAMP		 = ?1               
                            		and	   pst_.NUMSESSION	 = ?2               
                            		and	   pst_.CODREC		 = '6'              
                            		and	   pst_.NUMETAB		 = ctus.NUMETAB     
                            		and	   pst_.NUMEMP		 = ctus.NUMEMP      
                            		and	   pst_.NUMECAN_NOMM = ctus.NUMECAN)    
    		and    not exists (select * from td_pst pst__       
                            		where pst__.ANCAMP		= ?1                
    					and	  pst__.NUMSESSION	= ?2                
                            		and	  pst__.NUMECAN_NOMM = ctus.NUMECAN)
    Je ne sais pas si vous avez besoin de détail fonctionnels?

    Merci encore pour votre aide!!

    @+

    Fabszn

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    quel SGBDR et quel version ?

  12. #12
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    oupppss!! desolé j'ai oublié...

    Oracle 8i

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par fabszn
    oupppss!! desolé j'ai oublié...

    Oracle 8i
    et que donne le plan d'execution

  14. #14
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    2 trucs :
    si ça c'est une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pst_.NUMETAB = ctus.NUMETAB
    c'est pas bon. C'est jamais dans le WHERE les jointures mais dans le FROM avec un opérateur normalisé JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM td_pst pst_ INNER JOIN tds_ctu ctus ON pst_.NUMETAB = ctus.NUMETAB
    au risque de passer pour un con (j'ai jamais vu Oracle) c'est quoi ?1, ?2, ... bref le ? dans tes comparaison :

  15. #15
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par trotters213
    2 trucs :
    si ça c'est une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pst_.NUMETAB = ctus.NUMETAB
    c'est pas bon. C'est jamais dans le WHERE les jointures mais dans le FROM avec un opérateur normalisé JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM td_pst pst_ INNER JOIN tds_ctu ctus ON pst_.NUMETAB = ctus.NUMETAB
    au risque de passer pour un con (j'ai jamais vu Oracle) c'est quoi ?1, ?2, ... bref le ? dans tes comparaison :
    Concernant INNER JOIN cela permet de faire des jointures? cela remplace ce type de jointure :matable.monchamp=tatable.tonchamp?
    C plus optimisé?
    Cela veut dire que je peux l'utiliser dans n'importe quelle requete?



    En fait , cette requete est executé dans un prog Java... les ?X correspondent parametre de la requete (rien à voir avec Oracle)..

    Merci d'avance,

    @+

    Fabszn

  16. #16
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    oui le JOIN bien mieux. Ici tu y trouveras toutes les infos nécessaire et indispensable pour les utiliser (et les comprendre)

  17. #17
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Merci bcp pour cette info!!!

    Je vais regardé le lien... et changer ma facon de faire mes jointures...!!!

  18. #18
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    je te conseille quand même de travailler avec l'explain plan

  19. #19
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par trotters213
    2 trucs :
    si ça c'est une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pst_.NUMETAB = ctus.NUMETAB
    c'est pas bon. C'est jamais dans le WHERE les jointures mais dans le FROM avec un opérateur normalisé JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM td_pst pst_ INNER JOIN tds_ctu ctus ON pst_.NUMETAB = ctus.NUMETAB
    au risque de passer pour un con (j'ai jamais vu Oracle) c'est quoi ?1, ?2, ... bref le ? dans tes comparaison :

    Bonjour,

    J'essaye d'utiliser la methode jointure entre deux tables comme tu me l'as expliquer dans ton post..

    J'utilise Toad comme requeteur... mais celui ci ne reconnait pas le mot clef INNER JOIN...voila ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    SELECT * FROM TDS_CTU ctus INNER JOIN TD_CTU ctu ON ctus.ANCAMPCTU=ctu.ANCAMPCTU,ctus.NUMECAN=ctu.NUMECAN
    WHERE ctus.CDSUI='AQ'
    Est ce que le probleme vient de toad qui ne reconnais pas cette syntaxe, ou est ce que j'ai fait une erreur dans l'ecriture de la requete.

    Merci d'avance,

    @+

    Fabszn

  20. #20
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par fabszn
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM TDS_CTU ctus INNER JOIN TD_CTU ctu ON ctus.ANCAMPCTU=ctu.ANCAMPCTU,ctus.NUMECAN=ctu.NUMECAN
    WHERE ctus.CDSUI='AQ'
    Il faut que tu sépares les différentes clauses de ton INNER JOIN par des AND et non des virgules

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... ON ctus.ANCAMPCTU=ctu.ANCAMPCTU AND ctus.NUMECAN=ctu.NUMECAN

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Bien ou pas bien ?] ATI Radeon 2100
    Par Commodore dans le forum Composants
    Réponses: 7
    Dernier message: 10/07/2008, 12h24
  2. Réponses: 1
    Dernier message: 30/05/2007, 11h55
  3. createTextNode(' ') : bien ou pas bien ?
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/01/2007, 12h09
  4. [requete imbriquee] possible ou pas?
    Par catoucat dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/09/2006, 02h46
  5. Windows XP 64 bit, Bien ou Pas Bien ?
    Par ePoX dans le forum Windows XP
    Réponses: 12
    Dernier message: 27/12/2005, 15h10

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