Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/05/2011, 11h28   #1
 
Nassim NALLA
Inscription : février 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Nassim NALLA

Informations forums :
Inscription : février 2010
Messages : 60
Points : -1
Points : -1
Par défaut group by dans sous-requete

Salut amis développeurs

Je veux faire çà :

Citation:
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 :
Citation:
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
nasboy3d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 14h38   #2
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
Bonjour,

Et si tu fais une vue avec
Code :
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".
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h47   #3
 
Nassim NALLA
Inscription : février 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Nassim NALLA

Informations forums :
Inscription : février 2010
Messages : 60
Points : -1
Points : -1
Merci macben pour ta réponse rapide.
Citation:
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??
nasboy3d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h51   #4
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
Tu fais ton update dans un code pl/sql ou c'est juste une commande sql ?
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h54   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
En l'état le ORDER BY ne sert à rien puisqu'il est au même niveau que rownum... Il faudrait écrire :
Code :
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h59   #6
 
Nassim NALLA
Inscription : février 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Nassim NALLA

Informations forums :
Inscription : février 2010
Messages : 60
Points : -1
Points : -1
Citation:
Tu fais ton update dans un code pl/sql ou c'est juste une commande sql ?
C'est juste une commande sql
Citation:
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
nasboy3d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 16h26   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 17h42   #8
 
Nassim NALLA
Inscription : février 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Nassim NALLA

Informations forums :
Inscription : février 2010
Messages : 60
Points : -1
Points : -1
Citation:
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??
nasboy3d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 17h58   #9
 
Nassim NALLA
Inscription : février 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Nassim NALLA

Informations forums :
Inscription : février 2010
Messages : 60
Points : -1
Points : -1
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.....
nasboy3d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 18h18   #10
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Qu'est ce que ça donne avec row_number ?
Code :
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
Citation:
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 :
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h10.


 
 
 
 
Partenaires

Hébergement Web