62 votes

La combinaison de jointures explicites et implicites échoue avec "Il existe une entrée pour la table ... mais elle ne peut pas être référencée à partir de cette partie de la requête".

SELECT
      i.*, 
      r.name AS roomname, 
      c.name AS cat, 
      p.key AS imgkey, 
      p.extension AS imgext
   FROM 
      items i, 
      rooms r, 
      categories c 
         LEFT JOIN photos p 
            ON p.referencekey = i.key 
   WHERE 
          i.room = r.key 
      AND r.key = 663308 
      AND i.sitekey = 32201 
      AND c.key = i.categorykey

La requête ci-dessus, lorsqu'elle est exécutée, renvoie l'erreur suivante.

ERREUR : référence invalide à l'entrée de la clause FROM pour la table "i".

LIGNE 1 : ...tegory c LEFT JOIN photos p ON p.referencekey = i.key WHER...

INDICE : Il existe une entrée pour la table "i", mais elle ne peut pas être référencée à partir de cette partie de la requête.

61voto

Scott Marlowe Points 2231

La spécification SQL indique que les jointures explicites sont effectuées avant les jointures implicites. Ceci est une jointure implicite :

FROM table1 t1, table2 t2 WHERE t1.id=t2.t1id

Il s'agit d'une jointure explicite :

FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)

Ce bit de code :

categories c 
     LEFT JOIN photos p 
        ON p.referencekey = i.key 

est une jointure explicite et est exécutée en premier. Notez qu'à ce stade, la table aliasée i n'a pas encore été examinée, elle ne peut donc pas encore être jointe. Notez que MySQL a corrigé ce comportement dans la version 5.2 je crois, et cette requête ne fonctionnera plus là non plus.

36voto

gilly3 Points 33285

Déplacez votre JOIN à côté de la table à laquelle vous vous joignez :

SELECT
      i.*, 
      r.name AS roomname, 
      c.name AS cat, 
      p.key AS imgkey, 
      p.extension AS imgext
   FROM 
      items i
         LEFT JOIN photos p 
            ON p.referencekey = i.key, 
      rooms r, 
      categories c 
   WHERE 
          i.room = r.key 
      AND r.key = 663308 
      AND i.sitekey = 32201 
      AND c.key = i.categorykey

La longue explication :

A JOIN fait partie d'une expression qui donne lieu à une table source, utilisée dans la table FROM en tant que clause de_l'article . Votre FROM la clause a 3 de_l'article les tables sources :

  • items
  • rooms
  • categories joint à photos

L'erreur se situe dans le ON condition de réunion de votre categories joint à photos de_l'article . Vous faites référence à une table, items qui n'existe pas dans le de_l'article . La solution consiste à déplacer le photos se joindre à la items de_l'article de sorte que vous ayez les éléments suivants de_l'article les tables sources :

  • items joint à photos
  • rooms
  • categories

Malheureusement, je n'ai pas trouvé d'exemple dans la documentation qui explique clairement cette relation entre une table dans la base de données de l'entreprise et une table dans la base de données de l'entreprise. FROM et une clause JOIN . Le site SELECT Synopsis montre cette syntaxe et est la meilleure source dans la documentation pour trouver cette distinction. Notez qu'un JOIN n'est pas une clause sœur de FROM mais qui fait en réalité partie d'un de_l'article au sein de la FROM clause. Ainsi, si votre FROM consiste en une liste de tables, chaque table de cette liste pouvant avoir ses propres jointures. Il devient alors plus intuitif que chaque table impliquée dans une jointure doit être incluse dans une unique de_l'article .

16voto

DRapp Points 23901

Puisque votre Items.Room = the Rooms.Key, je voudrais juste avoir ça comme l'endroit

SELECT
      i.*, 
      r.name AS roomname, 
      c.name AS cat, 
      p.key AS imgkey, 
      p.extension AS imgext
   FROM 
      items i
         LEFT JOIN photos p 
            ON p.referencekey = i.key 
         JOIN rooms r
            on i.room = r.key
         JOIN categories c 
            on i.categorykey = c.key
   WHERE 
          i.sitekey = 32201 
      AND i.room = 663308

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X