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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Base oracle] SQL Error: ORA-00904: Nom de colonne non valide

par Vikchill » 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!

par zeus » 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

par Vikchill » 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

par zeus » 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 ;)

par Sékiltoyai » 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…

par zeus » 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 :?

par Sékiltoyai » 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.

par Pierig » 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

par Vikchill » 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?

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

par Pierig » 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 ? ^^