Почему использование псевдонима внутри оператора "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
)