[Base oracle] SQL Error: ORA-00904: Nom de colonne non valide

Eléphant du PHP | 73 Messages

20 août 2007, 11:51

Coucou,

J'ai une requête qui me pose problème mais je ne comprend pas vraiment parce qu'elle ne parait pas complexe du tout.

La requête :

Code : Tout sélectionner

Select EQUIPE from USER where TACHE.ABONNE = USER.ABONNE =
Le but étant de sélectionner le champs "EQUIPE" qui se trouve uniquement dans la table USER (a un USER est associé une équipe) et ou le code de l'abonné se trouvant dans la table tache correspond a celui de la table user.

C'est pour retrouver quelle équipe a demander la tâche en fait.

Oracle me retoune l'erreur suivante :

SQL Error: ORA-00904: Nom de colonne non valide

Mes mes noms de colonnes sont corrects et éxistent bel et bien.

J'ai du mal formuler ma requête :(

Une iddée ? :)

bye

EDIT : J'ai oublier de préciser mais ABONNE est la Primary key de la table USER et est en foreign key dans la table TACHE

EDIT2 : Peut être que je n'ai pas bien exposer mon problème plus haut donc je tente une seconde explication.

En fait je sélectionne les taches et a chaque tache j'ai besoin de retrouver le nom de l'équipe.
Je pourrait faire un "select ABONNE from tache" ça me donnerai ce dont j'ai besoin (si on veut) mais la ça me donnera le code de l'abonne moi j'ai besoin de son équipe cela se trouve dans la table USER.
Did you get me ? ^^
nouveau dans le monde du php
Maître du phpinfo() ce n'est pas rien tout de même xD

Eléphant du PHP | 193 Messages

20 août 2007, 16:02

Tu fais une jointure avec ta table TACHE, il faut donc qu'elle soit dans le FROM:

Code : Tout sélectionner

Select EQUIPE from USER, TACHE where TACHE.ABONNE = USER.ABONNE
Le '=' à la fin est une faute de frappe?

Eléphant du PHP | 73 Messages

20 août 2007, 16:24

Merci de m'avoir répondu j'avais mis résolu en désespoir de cause et je voulait pas embêter du monde pour si peu je pense que j'aurai trouver le problème d'ici un ou deux jours xD

Enfin c'est bon maintenant ça fonctionne.
le '=' était bien une fautre de frappe

bye
nouveau dans le monde du php
Maître du phpinfo() ce n'est pas rien tout de même xD

ViPHP
ViPHP | 5924 Messages

20 août 2007, 16:34

Tu fais une jointure avec ta table TACHE, il faut donc qu'elle soit dans le FROM:

Code : Tout sélectionner

Select EQUIPE from USER, TACHE where TACHE.ABONNE = USER.ABONNE
Le '=' à la fin est une faute de frappe?
Tu fais ici un produit cartésien, non une jointure. Et autant les produits cartésiens sont utiles quelquefois, autant ici, cela nuit aux performances, mieux vaut utiliser une vraie jointure :

Code : Tout sélectionner

SELECT equipe FROM user JOIN tache ON tache.abonne=user.abonne
La différence entre une jointure et un produit cartésien étant que le produit cartésien construit tous les couples et ensuite les soumet à la clause WHERE, alors que la jointure construit les couples en fonction de la clause ON du JOIN, ce qui réduit substantivement la liste des couples et donc le temps de traitement de la requète par le serveur.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 16:51

Je serais étonné que l'arbre d'optimisation d'Oracle ne soit pas programmé pour réaliser le tri avant de faire la jointure :-k

Tu as fait des tests de ce que tu avances ? Parce que j'ai quelques requêtes à reprendre alors :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

20 août 2007, 16:58

Je n'ai pas testé, mais j'ai étudié l'année passée le PostgreSQL avec un prof qui s'y connaît (enfin apparement c'est l'expert BDD de l'école), et il semblait dire que cela marchait comme ça. Après il faudrait bencher ou regarder les subtilités du SGBD pour vérifier. Peut être qu'après tout, les serveurs sont optimisés pour accélérer les requètes qui pourraient être des jointures, mais dans le principe, on ne nous l'a pas présenté ainsi…

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 17:01

Sur le principe, je suis 200% d'accord avec toi :pouce:

Après, il est vrai que j'ai pris la (mauvaise) habitude de ne pas bencher mes requêtes Oracle sur ce genre de subtilité car l'arbre d'optimisation d'Oracle prendra de toutes façon la main pour trouver le chemin le plus optimisé ...

Mais pour tout autre SGBD, tu as entièrement raison ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 193 Messages

20 août 2007, 17:18

Ah, bah la sémantique a dû évoluer, à mon époque on appelait ça une Jointure et Oracle avait du mal avec les instructions JOIN (avant la version 9?).

Pour moi, un produit cartésien c'est justement quand tu ne fais pas la jointure, tu as tous les n-uplets des champs du SELECT:

Code : Tout sélectionner

SELECT utilisateur, service_libelle FROM t_operateurs, t_services
Mais bon, ça fait un peu chipotage je trouve :p

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 17:36

Justement, ce que dit Sekiltoyai, c'est que la syntaxe

Code : Tout sélectionner

SELECT t1.a, t2.b FROM t1, t2 WHERE t1.id = t2.id
Est décomposée de la sorte :
- Réalisation d'un produit cartésien
- Application du WHERE donc retrait des tuples qui ne satisfont pas la condition
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 193 Messages

20 août 2007, 19:38

Oui oui, je sus complètement d'accord, je dis juste qu'en cours on appelait ça une jointure le "WHERE t1.id = t2.id", alors qu'il semble dire que ce n'est qu'un produit cartésien dans la première partie de la réponse. Je me demande quand même pourquoi la syntaxe "JOIN" serait tellement plus rapide, dans les deux cas tu lis tous et t'élimines, sauf que dans un cas t'élimines de suite si j'ai bien compris.

Si quelqu'un a fait des tests ou a des liens sur des tests effectués, je suis très curieux d'y jeter un coup d'oeil!