tutorial stable postgres current sql postgresql

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 a photos

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 las photos
  • 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 .