Подтвердить что ты не робот

Смешение явных и неявных объединений завершается с ошибкой: "Существует запись для таблицы... но на нее нельзя ссылаться из этой части запроса"

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

Вышеприведенный запрос при выполнении возвращает следующую ошибку.

ОШИБКА: неверная ссылка на запись FROM-clause для таблицы "i"

LINE 1:... te cory c LEFT JOIN photos p ON p.referencekey = i.key WHER...

СОВЕТ. Существует запись для таблицы "i", но на нее нельзя ссылаться из этой части запроса.

4b9b3361

Ответ 1

Так как ваш Items.Room = Rooms.Key, я бы просто получил это как где..

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 

Ответ 2

Спецификация SQL указывает, что явные объединения выполняются перед неявным объединением. Это неявное соединение:

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

Это явное соединение:

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

Этот бит кода:

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

является явным соединением и выполняется первым. Обратите внимание, что на данный момент таблица с псевдонимом, так как я еще не был просмотрен, поэтому он еще не может быть присоединен. Обратите внимание, что MySQL исправил это поведение в 5.2, я считаю, и этот запрос больше не будет работать там.

Ответ 3

Переместите оператор JOIN рядом со следующей таблицей:

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

Длительное объяснение:

A JOIN является частью выражения, которое приводит к исходной таблице, используемой в предложении FROM как from_item. В вашем предложении FROM есть 3 исходных таблицы from_item:

  • items
  • rooms
  • categories соединен с photos

Ошибка находится в ON join_condition вашего categories, присоединенного к photos from_item. Вы ссылаетесь на таблицу items, которая не существует в файле from_item. Решение состоит в том, чтобы переместить объединение photos в items from_item, чтобы у вас были следующие исходные таблицы from_item:

  • items, присоединенный к photos
  • rooms
  • categories

К сожалению, я не могу найти пример в документации, который очищает это отношение между таблицей в предложении FROM и a JOIN. SELECT Синопсис показывает этот синтаксис и является лучшим источником в документации, чтобы найти это различие. Обратите внимание, что JOIN не является предложением sibling для FROM, но фактически является частью from_item в предложении FROM. Таким образом, если ваш предложение FROM состоит из списка таблиц, каждая таблица в этом списке может иметь свои собственные соединения. Затем становится более понятным, что каждая таблица, участвующая в соединении, должна быть включена в один элемент from_item.