Le mélange explicite et implicite des jointures échoue avec " il y a une entrée pour 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 non valide à L'entrée "FROM-clause" pour la table "i"

ligne 1:...TEGORY c gauche joindre les photos p à la p. referencekey = I. key wer...

indice: il y a 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.

22
demandé sur Craig Ringer 2011-06-14 21:59:13

3 réponses

Depuis vos Articles.Chambre = les Chambres.La clé, je voudrais juste que le "où"..

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 
10
répondu DRapp 2011-06-14 18:04:44

la spécification SQL stipule que les jointures explicites sont effectuées avant les jointures implicites. C'est une jointure implicite:

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

Ceci est 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 lancé en premier. Notez qu'à ce point la table aliased car je n'ai pas encore été regardé, donc il ne peut pas être joint encore. Notez que MySQL a corrigé ce comportement en 5.2 je crois, et cette requête ne fonctionnera plus là non plus.

25
répondu Scott Marlowe 2012-10-30 10:06:59

Déplacer JOIN déclaration suivante à la table que vous rejoindre sur:

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:

JOIN fait partie d'une expression qui aboutit à une table source, utilisée dans le FROM clause from_item. Votre FROM la clause a 3 from_item tableaux des sources:

  • items
  • rooms
  • categories joint pour photos

l'erreur est dans Le ONjoin_condition de votre categories joint photos from_item. Vous faites référence à un tableau, items, qui n'existe pas dans le from_item. La solution est de déplacer la photos Rejoignez le items from_item, de sorte que vous avez le suivant from_item tableaux des sources:

  • items joint pour photos
  • rooms
  • categories

malheureusement, je ne trouve pas d'exemple dans la documentation qui clarifie cette relation entre une table dans le FROM clause JOIN. SELECT Synopsis montre cette syntaxe et est la meilleure source de la documentation pour trouver cette distinction. Notez qu'un JOIN n'est pas une clause fraternelle à FROM, mais fait partie d'un from_item dans le FROM clause. Ainsi, si votre FROM clause se compose d'une liste de tables, chaque table dans cette liste peut avoir ses propres jointures. Il devient alors plus intuitif que chaque table impliquée dans une jointure doit être incluse dans un seul from_item.

6
répondu gilly3 2017-01-04 18:22:13