sql - stable - La combinación de combinaciones explícitas e implícitas falla con "Hay una entrada para la tabla... pero no se puede hacer referencia a partir de esta parte de la consulta"
postgresql version (3)
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 consulta anterior cuando se ejecuta devuelve el siguiente error.
ERROR: referencia no válida a la entrada FROM-clause para la tabla "i"
LÍNEA 1: ... tegory c LEFT JOIN fotos p ON p.referencekey = i.key WHER ...
SUGERENCIA: hay una entrada para la tabla "i", pero no se puede hacer referencia a partir de esta parte de la consulta.
La especificación SQL establece que las uniones explícitas se realizan antes de las uniones implícitas. Esta es una unión implícita:
FROM table1 t1, table2 t2 WHERE t1.id=t2.t1id
Esta es una unión explícita:
FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)
Este código bit
categories c
LEFT JOIN photos p
ON p.referencekey = i.key
es una unión explícita y se ejecuta primero. Tenga en cuenta que en este momento la tabla tiene un alias porque aún no se ha analizado, por lo que aún no se puede unir. Tenga en cuenta que MySQL solucionó este comportamiento en 5.2 Creo, y esta consulta ya no funcionará allí.
Desde sus Items.Room = the Rooms.Key, solo lo tendría como el lugar ...
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
Mueva su declaración JOIN
junto a la tabla en la que se está uniendo:
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 larga explicación
Un JOIN
es parte de una expresión que da como resultado una tabla fuente, utilizada en la cláusula FROM
como elemento from_item . Su cláusula FROM
tiene 3 tablas fuente from_item :
-
items
-
rooms
-
categories
unidas aphotos
El error se encuentra en ON_condición de tus categories
unidas a photos
from_item . Está haciendo referencia a una tabla, items
, que no existe en from_item . La solución es mover las photos
para unirlas a los items
from_item , de modo que tenga las siguientes tablas fuente from_item :
-
items
unidos a lasphotos
-
rooms
-
categories
Lamentablemente, no puedo encontrar un ejemplo en la documentación que aclare esta relación entre una tabla en la cláusula FROM
y una JOIN
. La sinopsis SELECT
muestra esta sintaxis y es la mejor fuente en la documentación para encontrar esta distinción. Tenga en cuenta que un JOIN
no es una cláusula hermana de FROM
, sino que forma parte de from_item dentro de la cláusula FROM
. Por lo tanto, si su cláusula FROM
consta de una lista de tablas, cada tabla en esa lista puede tener sus propias combinaciones. Entonces se vuelve más intuitivo que cada tabla involucrada en una unión debe incluirse en un único from_item .