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 requete


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut update avec sous requete
    Bonjour, je ne suis pas expert des requêtes un peu spéciales qui dépassent le update set.. where...

    J'ai tenté pas mal de chose mais rien ne fonctionne, je m'explique.

    - Je dois mettre a jour un champs dans table1 selon une valeur de table2
    - Table2 est lié avec table1 sur num
    - je ne veux que la derniere valeur insérée dans table2 concernant mon num.

    Imaginons, client (table1) et commande (table2)

    En analysant, mon schema est le suivant :

    Pour un numclient donné, je recupere la derniere datecommande dont jai besoin dans commande :

    1)
    select datecommande from
    (select * from commande where numclient=123 order by idcommande desc)
    where rownum=1

    ==> (equivalant à un TOP(1))

    ca fonctionne, ca me renvoie bien la derniere commande pour mon client 123

    2) Maintenant, Je dois mettre a jour TOUTE ma table client, en mettant pour chacun dans le champs dernieredatecommande sa derniere date de commande de la table commande

    j'ai fais un truc dans le genre :

    update client
    set datedernierecommande=(select datecommande from (select * from commande order by idcommande desc) where rownum=1)
    and exists
    (select * from commande where commande.numclient=client.numclient);

    Evidemment, Le resultat attendu n'est pas celui là, ca me met la derniere date commande a tous mes clients, mais pas la leur

    Ce n'est peut etre pas tres clair, mais pour plus de précision n'hesitez pas.

    Note : les tables client et commandes sont fictives, evidemment que là c'est idiot comme raisonnement, mais le but est de mettre a jour mon champs dans table1 suivant le resultat de la sous requete de table2)

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Désolé pour le derangement :

    update client set datedernierecommande=(
    select max(datecommande) from commande where commande.numclient=client.numclient group by numclient) where numclient in(select distinct(numclient) from commande)

    ca fonctionne, mais est ce optimisé ?

    Merci

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    1 -

    2 - Non ce n'est pas optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MAX(datecommande)
    	FROM commande 
        WHERE commande.numclient=client.numclient 
        GROUP BY numclient
    Le group BY numclient ne sert à rien vu que tu restreint déjà au numclient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE numclient IN (SELECT DISTINCT(numclient) FROM commande)
    Pas super bon. Mieux vaut utiliser un EXISTS qu'un IN généralement.
    Et puis le DISTINCT n'est pas utile dans un IN

    Voici ce que j'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE CLIENT cl
    SET datedernierecommande=(
    	SELECT MAX(datecommande)
    	FROM COMMANDE b 
        WHERE b.numclient=cl.numclient) 
    WHERE EXISTS (SELECT 1 FROM COMMANDE co 
    		WHERE co.numclient = cl.numclient)
    Et si c'est une requete qui va tourner plus d'une fois faut rajouter le test que la date change sinon, tu réupdate tous les clients.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND NVL(datedernierecommande, TO_DATE('01.01.0001','DD.MM.YYYY') 
    		<> (SELECT MAX(datecommande)
    		FROM COMMANDE b 
    		  WHERE b.numclient=cl.numclient
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Pb update avec sous requete
    Par cdsoft dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/07/2008, 23h26
  2. MySQL: Probleme d'UPDATE avec sous requete SELECT
    Par simonius dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/11/2007, 14h57
  3. Requete Update avec sous requete et jointure
    Par javaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2007, 11h03
  4. Requete Update avec sous requete
    Par joziel dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/08/2006, 15h15
  5. problème update avec sous requetes
    Par stoz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/10/2005, 16h44

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