Requete SQL Oracle : Pourquoi ca ne marche pas ?

Requete SQL Oracle : Pourquoi ca ne marche pas ? - SQL/NoSQL - Programmation

Marsh Posté le 01-04-2004 à 01:34:30    

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 :
  1. SELECT B.*
  2. FROM (
  3.    SELECT A.*, ROWNUM rnum
  4.    FROM (
  5.       SELECT *
  6.       FROM File_Stored f, Submitter s, Person p, File_Property fp
  7.       WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers
  8.                                   AND fp.id_File = f.id_File
  9.       ORDER BY &orderCritaeria DESC
  10.    ) A
  11.    WHERE ROWNUM < &max
  12. ) B
  13. 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 :
  1. SELECT *
  2. FROM File_Stored f, Submitter s, Person p, File_Property fp
  3. WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers
  4.                             AND fp.id_File = f.id_File
  5. 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 :
  1. SELECT B.*
  2. FROM (
  3.    SELECT A.*, ROWNUM rnum
  4.    FROM (
  5.       SELECT first_name, prop_name, last_name, f.id_File, file_name, file_descr, file_date 
  6.       FROM File_Stored f, Submitter s, Person p, File_Property fp
  7.       WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers
  8.                                   AND fp.id_File = f.id_File
  9.       ORDER BY &orderCritaeria DESC
  10.    ) A
  11.    WHERE ROWNUM < &max
  12. ) B
  13. 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 ?

Reply

Marsh Posté le 01-04-2004 à 01:34:30   

Reply

Marsh Posté le 03-04-2004 à 16:49:27    

Clairement, quand tu fais 'select * ' avec plusieurs tables qui ont le même champ, Oracle ne sait pas lequel prendre ;)
 
en fait il doit lui falloir un identifiant unique pour chaque champ résultant de la requête, ce qui est logique car si tu veux ensuite accéder au résultat de cette requête, tu dois pouvoir sélectionner le champ id_file de façon unique.
 
Donc en gros, il faut lister tous les champs des tables ayant un champ en commun ...
 
Au passage, tu devrais pouvoir simplifier un peu ta requête :
 

Code :
  1. SELECT *
  2.   FROM (SELECT first_name, prop_name, last_name, f.id_File, file_name, file_descr, file_date 
  3.         FROM File_Stored f, Submitter s, Person p, File_Property fp 
  4.         WHERE s.id_file = f.id_file AND p.id_Pers = s.id_Pers 
  5.                                     AND fp.id_File = f.id_File 
  6.         ORDER BY &orderCritaeria DESC) 
  7.   WHERE ROWNUM BETWEEN &min AND &max;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed