|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : septembre 2006 Messages : 7 ![]() |
J'ai un problème basique lié à un encodeur de requete générique. Les requetes sont complexes mais on peut simplifier le pb ainsi
(J'ai oracle 10 XE + java et JDBC driver donné avec Oracle). Je fais : select USER.USR_ID from USER Cela marche nickel : 10 entrées par exemple. Maintenant, en prévision d'une clause where j'ajoute une table dont je ne demande aucun champ : select USER.USR_ID from USER, SAMPLING_ID Pour l'instant je ne mets pas encore de where. Si SAMPLING_ID contient une ligne ou plus : OK, j'ai bien mes réponses. Si SAMPLING_ID est vide, alors j'ai un retour vide (empty result) sans même mettre un where. Bien évidemment ensuite avec le where je n'ai rien non plus. Comment encoder cette requete ? |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
produit cartésien, ça vous dit quelque chose ?
|
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
Code :
|
||
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : septembre 2006 Messages : 7 ![]() |
Ok pour la remarque sur USER, en fait mes tables ont des noms plus compliqué alors j'avais renommé et simplifié avant de mettre sur le forum car la requete fait 3 lignes .
Mais en fait je comprends le pb : effectivement, le select fait un produit cartesien et me retourne une liste vide apres je peux faire tous les where que je veux ... Par contre dans mon cas ce n'est pas simple de faire autrement car je cherche des réponse dans une liste de tables, associées 3 par trois par des unions. Sur certaines j'ai des filtres et je veux celle ou il y a des réponses. Comme si j'avais une table PRODUIT et des infos complémentaires pour TV (union avec produit), HIFI (union avec produit) etc... je veux des infos sur les produits tels que si c'est une TV alors xxxx ou bien si c'est une HIFI alors ... du coup si une liste est vide, tout mon produit cartésien fait Flop. la requete est générée automatiquement à partir de filtres utilisateurs. :-( Il faut que l'écrive autrement |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Chef de projet en SSII Inscription : janvier 2004 Messages : 2 866 ![]() |
Il faut que vous fassiez une jointure externe entre votre table user et sampling_id.
__________________
Un problème sans solution est un problème mal posé Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP. |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : septembre 2006 Messages : 7 ![]() |
Effectivement sur le principe ca a l'air de marcher : bizarre comme syntaxe de where qui AJOUTE des réponses à la meme clause sans le where.
select USR_ID from USER_ATPI, SAMPLING_ID --> Vide select USR_ID from USER_ATPI, SAMPLING_ID where USER_ATPI.USR_ID = SAMPLING_ID.SAM_ID (+) --> plusieurs réponses Il n'y a pas de syntaxe standard SQL pour ces Outer Join ? + a l'air d'etre spécifique à Oracle... je me serai aussi attendu a avoir ce outer join dans le from ? |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Expert Datawarehouses + BO (sur BDD Oracle et SQL Server) Inscription : mars 2003 Messages : 645 ![]() |
Code :
|
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : septembre 2006 Messages : 7 ![]() |
Vos réponses en LEFT JOIN et le Outer join (+) marchent sur mon exemple simple. Par contre à encoder dans ma requete générale qui est générée cela s'annonce coriace quand il y a plein de tables et de jointures possibles.
En fait c'eest un utilisateur dans une IHM qui saisit 1 à n conditions de filtrage, y compris à travers de relation sur des tables qui sont liées par une union. Je me demande si le plus simple a écrirer et maintenir ne serait pas tout simplement d'envoyer autant de fois la requete select que j'ai de or et de faire une UNION : plutot que d'écrire Select A.ID from A,B,C where (<condition sur A et B>) OR (<condition sur A et C>) de faire Select A.ID from A,B where (<condition complexe sur A et B>) UNION Select A.ID from A,Cwhere (<condition complexe sur A et C>) Cela aurait l'avantage d'etre symétrique et de pouvoir etre testé par morceaux. Il n'y a d'ailleurs pas des jointures que 2 par 2, cela m'aurait bien arrangé de faire la recherche sur A,B et C d'un coup car ce que j'ai c'est la liste des tables impactées A,B,C... et la liste des conditions a vérifier sur tout ce beau monde dans un filtre (converti en un where). Je tente de voir la complexité de l'union. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com