Hello
J'ai pete un cable aujourd'hui pendant un certain temps sur une requete SQL sous Oracle... Ayant enfin trouve ce qui ne fonctionnait pas, je me demande a present POURQUOI ca ne fonctionnait pas.
Voici la requete initiale (les valeurs (&min et &max sont calculees dynamiquement et sont des entiers en realite, &orderCritaeria est defini par l'utilisateur et est un attribut qui est selectionne):
Code :
- SELECT B.*
- FROM (
- SELECT A.*, ROWNUM rnum
- FROM (
- SELECT *
- FROM File_Stored f, Submitter s, Person p, File_Property fp
- WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers
- AND fp.id_File = f.id_File
- ORDER BY &orderCritaeria DESC
- ) A
- WHERE ROWNUM < &max
- ) B
- WHERE B.rnum >= &min
|
Le but de la requete est donc de faire une requete, la classer par &orderCritaeria et n'afficher que les valeurs comprises entre &min et &max.
Pour les gens sous mysql : NON il n'y a pas de keyword LIMIT et oui c'est ce que je cherche a faire.
Le probleme : "reference to column is ambigus". Que ce soit via tomcat, sql+, et autres outils toujours le meme message. Par contre le code seul :
Code :
- SELECT *
- FROM File_Stored f, Submitter s, Person p, File_Property fp
- WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers
- AND fp.id_File = f.id_File
- ORDER BY &orderCritaeria DESC
|
Passe sans aucun probleme... Donc ce sont les selects imbriques qui posaient probleme.
Apres de nombreux essais infructueux j'en suis arrive a l'essais de ceci :
Code :
- SELECT B.*
- FROM (
- SELECT A.*, ROWNUM rnum
- FROM (
- SELECT first_name, prop_name, last_name, f.id_File, file_name, file_descr, file_date
- FROM File_Stored f, Submitter s, Person p, File_Property fp
- WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers
- AND fp.id_File = f.id_File
- ORDER BY &orderCritaeria DESC
- ) A
- WHERE ROWNUM < &max
- ) B
- WHERE B.rnum >= &min
|
Et la ca marche. Apparemment c'est le id_file qui lui pose probleme car il le considere comme ambigu (prennant deux valeurs) et desire que je choisisse un id_File... (il ne le dit pas clairement en plus).
Mais la je ne comprends pas comment oracle resout la requete... Vraiment pas. id_File fait partie d'une jointure, donc f.id_file et s.id_file sont identiques, donc il s'en fiche de savoir lequel prendre (la preuve le select seul passe) et oracle se debrouille bien tout seul. Les champs que j'ai choisis representent tous les champs a peu pres. Pourquoi l'* ne passe-t-elle pas des qu'on imbrique les selects ? Il perd l'information que ces deux attributs font partie d'une jointure et les considere comme potentiellement differents ?
Bref ce n'est pas logique a mon goutou tout du moins pas consistant.
Qqun aurait-il une explication plus precise ?