Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1640 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requete SQL Oracle : Pourquoi ca ne marche pas ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requete SQL Oracle : Pourquoi ca ne marche pas ?

n°689246
Kahyman
Posté le 01-04-2004 à 01:34:30  profilanswer
 

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 ?

mood
Publicité
Posté le 01-04-2004 à 01:34:30  profilanswer
 

n°691692
Beegee
Posté le 03-04-2004 à 16:49:27  profilanswer
 

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;


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requete SQL Oracle : Pourquoi ca ne marche pas ?

 

Sujets relatifs
Probléme avec une requête PHP/MySQLRenommer une colonne sur Oracle
trie en sql sur jointureFaire un lien sur le résultat d'une requête
les Cookies, c'est bien comme ça que sa marche ?[ORACLE] Trigger bien compilé qui ne marche pas bien
[SQL] Probleme de connexion à une base[java][sql]connection java/Sql Server
enregistrer la résultat d'une requête dans une textbox 
Plus de sujets relatifs à : Requete SQL Oracle : Pourquoi ca ne marche pas ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR