|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : juin 2002 Messages : 3 ![]() |
Bonjour,
J'ai un petit problème de sous requète sous Sybase Je sais que l'on peux appliquer après un FROM une sous requête en SQL du type Code :
Je n'arrive pas à appliquer cette méthode à une requète Sybase, et ca m'arrangerai bien ![]() Sachant que les views ne m'interrèssent pas ... Merci d'avance
|
||
|
|
00
|
|
|
#2 | ||||||
![]() ![]() |
Sous Sybase, les sous-requêtes marchent, mais elles ne sont pas à mettre n'importe où, comme par exemple dans ton exemple.
Par contre, il est souvent plus judicieux de passer pour une jointure simple, ce qui est plus optimal dans la plupart des cas. Pour ton exemple, si tu veux n'afficher que les noms apparaissant plus de 10 fois, tu doix utiliser un having si tu pose une condition sur le résultat d'un agrégat Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : février 2003 Messages : 23 ![]() |
PAs trop d'accord dans le sens ou où du SQL ne s'optimise pas, ce sont l'utilisation judicieuse des index ou cluster qui vont permettre uen bonne performance.
Donc tu peux tout à fait Générer dans ta clause Where un filtre de sous requête, mais n'oublis pas que si tu à toujours un risque de générer un produit cartésien dans ta sous-requête. A toi de connaitre précisement ton MCD. Je te conseillerai d'utiliser le Sp_helpindex pour déterminer les index disponible, de modéliser tes jeux de requetes qui devrait créer tes tables en clause WHERE dans ta requête finale. En effet je doute que cette question provienne de la simple méconnaissance des agrégats. Quoiqu'il arrive, je te conseille avant toute chose de mettre dans ton script avant l'éxecution un : set noexec on go set showplan on go PS : table scan en resultat, c mauvais signe. Positioning by key, c mieux Using clustered index, c good. JE te joins un exemple concret de requete sybase avec une sous requete : select convert(char(12),C.adtvl,103),";", convert(char(6),B.azcogl1),";", "EUR",";", str(C.amtvlnr,10,3),";", str(C.amtactr,10,3) from ADMIN..aprt A,ADMIN..aptx B(index aptx_c),ADMIN..ahvl C(index ahvl_nc2) where C.aidprt=A.aidprt and B.aidptx=A.aidprt and B.azcogl1 like "508%" and C.adtvl between (select all max(C.adtvl) from ADMIN..ahvl C where C.aidprt=" 5000001") and getdate() J'espére que cet exemple concret t'apportera une vraie réponse. 3 tables sur 1 base sont exploitées. La contrainte majeure est que l'élément de tri n'est pas un index ou un élément de clef. Cependant, un des éléments de requête est une partie de clef décomposée. Malheureusement, un tri doit être opéré dessus. Heureusement, elle dispose d'un index qui est lui déclarable. Et là, ma requête, qui peut être écrite plus simplement est réellement opérationnelle puisqu'elle génére mon résultat en un minimum de temps de traitement. EOF |
|
|
00
|
|
|
#4 | ||||||||
![]() ![]() |
Citation:
Exemple ? Code :
par contre Code :
CQFD Citation:
Se plus, si tu veux obtenir encore plus d'info de l'optimiseur, tu peux exécuter Code :
|
||||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com