Смешивание явных и неявных объединений завершается неудачно с «Есть запись для таблицы ..., но на нее нельзя ссылаться из этой части запроса» - PullRequest
32 голосов
/ 14 июня 2011
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 для таблицы "i"

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

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

Ответы [ 3 ]

32 голосов
/ 16 июня 2011

В спецификации 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, я полагаю, и этот запрос там больше не будет работать.

17 голосов
/ 04 января 2017

Переместите свой оператор 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 и JOIN.SELECT Сводка показывает этот синтаксис и является лучшим источником в документации, чтобы найти это различие.Обратите внимание на то, что JOIN не является родственным условием для FROM, но фактически является частью from_item в пределах предложения FROM.Таким образом, если ваше предложение FROM состоит из списка таблиц, каждая таблица в этом списке может иметь свои собственные объединения.Тогда становится более интуитивно понятно, что каждая таблица, участвующая в объединении, должна быть включена в один from_item .

12 голосов
/ 14 июня 2011

Так как ваш 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...