Почему использование псевдонима внутри оператора "JOIN (SELECT)" приводит к ошибке?

Я использую MySQL 5.5.16

У меня есть следующий запрос, который прекрасно работает сам по себе.

SELECT DISTINCT i.id, 
CASE WHEN e.date >  '2012-10-16'
THEN e.date
ELSE  '9999-99-99'
END AS date, 
CASE WHEN e.date >  '2012-10-16'
THEN time
ELSE  '99-99-99'
END AS time
FROM items AS i
LEFT JOIN expiration AS e ON ( e.item_id = i.id ) 
WHERE (
(
data >=  '2012-10-16'
AND e.valid=1
)
OR i.never_expires=1
)
AND i.valid=1
ORDER BY date ASC , time ASC 
LIMIT 0 , 10

Однако, когда я включаю его в запрос большего размера, я получаю сообщение об ошибке Column 'date' in where clause is ambiguous, Вот пример, где запрос выше находится внутри JOIN:

SELECT i.id, i.title, i.never_expires, 
CASE WHEN e.date>  '2012-10-16'
THEN e.date
ELSE  '9999-99-99'
END AS date, 
CASE WHEN e.date >  '2012-10-16'
THEN e.time
ELSE  '99-99-99'
END AS time, i.item_price AS price
FROM items AS i
LEFT JOIN expiration AS e ON ( e.item_id = i.id )
JOIN (
  SELECT DISTINCT i.id, 
  CASE WHEN e.date >  '2012-10-16'
  THEN e.date
  ELSE  '9999-99-99'
  END AS date, 
  CASE WHEN e.date >  '2012-10-16'
  THEN time
  ELSE  '99-99-99'
  END AS time
  FROM items AS i
  LEFT JOIN expiration AS e ON ( e.item_id = i.id ) 
  WHERE (
  (
  data>=  '2012-10-16'
  AND e.valid=1
  )
  OR i.never_expires=1
  )
  AND i.valid=1
  ORDER BY date ASC , time ASC 
  LIMIT 0 , 10
) AS ilist ON (i.id=ilist.id) 
WHERE (
(
date >=  '2012-10-16'
AND e.valid=1
)
OR i.never_expires=1
)
AND i.valid=1
ORDER BY dateASC , time ASC

Почему он утверждает, что date неоднозначно?

PS я пробовал заменить date в AS date часть внутреннего запроса с inner_date, но это просто выбрасывает другую ошибку Unknown column 'inner_date' in 'where clause'...

1 ответ

Решение

Вы присоединяетесь к expiration таблица, в которой есть столбец с именем dateк материализованной таблице, которая сама имеет столбец (из CASE выражение) по имени date, Вы должны квалифицировать использование date в вашем WHERE предложение с псевдонимом любой таблицы, на которую вы собираетесь ссылаться.

Или:

WHERE (
(
ilist.date >=  '2012-10-16'
AND e.valid=1
)

Или же:

WHERE (
(
e.date >=  '2012-10-16'
AND e.valid=1
)
Другие вопросы по тегам