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 24/04/2007, 15h13   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 7
Points : 3
Points : 3
Par défaut Probleme majeur sur Oracle XE : limite dans ma clause where

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 ?
nbodin78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 15h16   #2
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
produit cartésien, ça vous dit quelque chose ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 15h46   #3
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Code :
1
2
3
4
5
6
7
8
9
 
SQL> SELECT
  2  USER.USR_ID
  3  FROM
  4  USER;
USER.USR_ID
    *
ERROR at line 2:
ORA-00923: FROM keyword NOT found WHERE expected
mauvaise idée d'appeler sa table USER, qui est un mot réservé...
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 15h53   #4
Invité de passage
 
Inscription : septembre 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 7
Points : 3
Points : 3
Par défaut Suite

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
nbodin78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 16h45   #5
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 17h06   #6
Invité de passage
 
Inscription : septembre 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 7
Points : 3
Points : 3
Par défaut Clause where qui ajoute des entrées

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 ?
nbodin78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 17h24   #7
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
Code :
1
2
3
4
SELECT  USR_ID
FROM  USER_ATPI
LEFT JOIN  SAMPLING_ID
ON USER_ATPI.USR_ID = SAMPLING_ID.SAM_ID
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 17h40   #8
Invité de passage
 
Inscription : septembre 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 7
Points : 3
Points : 3
Par défaut Effectivement

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.
nbodin78 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 16h00.


 
 
 
 
Partenaires

Hébergement Web