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

Oracle Discussion :

group by dans sous-requete


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut group by dans sous-requete
    Salut amis développeurs

    Je veux faire çà :

    UPDATE table1 m SET m.col1 =
    (select col1 from table2 e
    where m.col2 = e.col2
    and e.col2 <> ''
    and e.col3 <= (select coltemp from table3 where m.col3 = col_id)
    and rownum<2 order by e.col3 desc)
    where m.col3 = (select col_id from table4)
    Mais comme certains le savent, avec Oracle on ne peut pas utiliser le order by dans une sous-requete.
    Pour les plus curieux voilà ce que ça retourne comme erreur :
    Erreur SQL : ORA-00907: parenthèse de droite absente
    00907. 00000 - "missing right parenthesis"
    J'ai beau tout essayé (fonctions analytiques et autres...) mais rien n'y fait ça marche pas. Donc je viens faire appel à votre dev-solidarité.
    Merci

  2. #2
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Bonjour,

    Et si tu fais une vue avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create view taVue as select col1 from table2 e
    where m.col2 = e.col2
    and e.col2 <> ''
    and e.col3 <= (select coltemp from table3 where m.col3 = col_id)
    and rownum<2 order by e.col3 desc
    et que tu fais ton update qui s'appuie sur ta vue ça donne quoi ?

    Mais j'avoue que ton update me paraît "bizarre".

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut
    Merci macben pour ta réponse rapide.
    et que tu fais ton update qui s'appuie sur ta vue ça donne quoi ?
    ça marche d'une façon ou d'une autre mais c'est à mon avis pas du tout efficace car à chaque ligne à updater il faut parcourir la table à updater...à moins d'utiliser une vue matérialisée....qu'en penses-tu ??
    Sinon est-ce que quelqu'un aura une autre solution à proposer??

  4. #4
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Tu fais ton update dans un code pl/sql ou c'est juste une commande sql ?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    En l'état le ORDER BY ne sert à rien puisqu'il est au même niveau que rownum... Il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select col1
      from (SELECT col1 
              FROM table2 e
             WHERE m.col2 = e.col2
               AND e.col2 <> ''
               AND e.col3 <= (SELECT coltemp FROM table3 WHERE m.col3 = col_id)
             ORDER BY e.col3 DESC
            )
     where rownum = 1

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut
    Tu fais ton update dans un code pl/sql ou c'est juste une commande sql ?
    C'est juste une commande sql
    En l'état le ORDER BY ne sert à rien puisqu'il est au même niveau que rownum... Il faudrait écrire :
    Oui c'est vrai je rectifie...mais ça ne résoud pas le pb

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Si tu es en 10G+ et que tu peux corréler table4 et table3 avec col_id alors tu peux utiliser MERGE en utilisant uniquement la clause WHEN MATCHED.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut
    Si tu es en 10G+ et que tu peux corréler table4 et table3 avec col_id alors tu peux utiliser MERGE en utilisant uniquement la clause WHEN MATCHED.
    Aujourd'hui 15h59
    Merci skuatamad ça me semble etre une bonne idée mais est ce que les perf seront pas pareils que si je faisais une vue intermédiaire comme suggéré par macben??

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut
    En fait l'idée de skuatamad ne marchera pas dans mon cas car je ne peux pas corréler table4 et table3 avec col_id....
    Au mieux je ne peux que faire un produit cartésien de table4 avec le contenu de mon USING et là trop de lignes générés pour rien.....

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Qu'est ce que ça donne avec row_number ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT col1
      FROM (SELECT col1, row_number() over(ORDER BY e.col3 DESC) as rn 
              FROM table2 e
             WHERE m.col2 = e.col2
               AND e.col2 <> ''
               AND e.col3 <= (SELECT coltemp FROM table3 WHERE m.col3 = col_id)         
            )
     WHERE rn = 1
    Au mieux je ne peux que faire un produit cartésien de table4 avec le contenu de mon USING
    Ton exemple est mal construit alors, parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from table3 where m.col3 = col_id
    ...
    m.col3 = (select col_id from table4)
    laisse supposer qu'il y a un lien entre les tables.

Discussions similaires

  1. Requete, case, group by et sous requetes
    Par brice.f dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/08/2012, 11h30
  2. Problème de soustraction dans sous requete
    Par Harry dans le forum SQL
    Réponses: 4
    Dernier message: 23/11/2010, 11h03
  3. [SSIS][2k5] Multi Group By dans une requete SQL.
    Par Djaiffe dans le forum SSIS
    Réponses: 9
    Dernier message: 11/02/2009, 10h18
  4. pb de critères dans sous-requetes
    Par marco361020 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/03/2008, 17h27
  5. Mettre une moyenne d'un groupe+individuelle dans 1 requete
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/07/2005, 13h02

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