Ошибка «неоднозначной колонки» означает, что имеется ссылка на идентификатор столбца, а MySQL имеет два (или более) возможных столбца, соответствующих спецификации. В этом конкретном случае ссылка на столбец CategoryID
в пункте WHERE
. «Неоднозначно» относится ли это к столбцу CategoryID
от cat
или столбцу CategoryID от p
.
«Фиксация» заключается в том, чтобы квалифицировать эту ссылку на столбец с псевдонимом таблицы либо cat.CategoryID
, либо p.CategoryID
.
Некоторые дополнительные примечания:
Это очень странно иметь IN (subquery)
предикат в предложении ON
. Если CategoryID
не является уникальным в таблице Category
, этот запрос, скорее всего, будет генерировать больше строк, чем ожидалось.
нормальный шаблон для запроса, как это было бы что-то похожее на:
SELECT cat.CategoryID AS CategoryID
, COUNT(p.ProductID) AS CountProducts
FROM Category cat
LEFT
JOIN Products p
ON p.CategoryID = cat.CategoryID
WHERE cat.ParrentCategoryID = '876'
ORDER BY cat.Name
Обычно, предикаты в ON
ссылочных положение столбцов в двух (или более) таблиц в предложении FROM. (Это не является обязательным требованием SQL. Это просто обычная картина.)
Сказуемое в предложении запроса ON
выше указывает, что значение CategoryID
колонки от cat
(категория) таблица матч значение в CategoryID
столбец из таблицы p
(продукт).
Кроме того, наилучшей практикой является присвоение всех столбцов, на которые делается ссылка в запросе с именем таблицы, или псевдоним таблицы, даже если имена столбцов не являются двусмысленными. Например, столбец Name
в предложении ORDER BY
.
Одно большое преимущество в том, что если (в каком-то момент в будущем) столбец с именем Name
добавляется в Products
таблицу, запрос с неквалифицированной ссылкой на Name
бы (тогда) начинает бросать «неоднозначную колонку "для этой ссылки. Таким образом, определение всех имен столбцов позволяет избежать «разрыва» рабочего запроса при добавлении новых столбцов в существующие таблицы.
Другим большим преимуществом является то, что читателю заявления. MySQL может очень быстро искать в словаре, чтобы найти, какая таблица Name
. Но читатели инструкции SQL (например, я), которые не «знают», какая таблица содержит столбец с именем Name
, также должны были бы посмотреть на определения таблиц выяснить. Если имя было квалифицированным, мы уже «знали», из какой таблицы был столбец.
Категория ИД находится в обеих таблицах. Не рекомендуется указывать столбец идентификатора с именем таблицы - просто «id» является отраслевым стандартом, потому что он работает лучше всего. – Bohemian
Использование предиката 'IN (subquery)' в предложении 'ON' очень странно. Обычно предикаты в разделе «ON» ссылаются на столбцы из таблиц в предложении FROM. (У меня трудности с пониманием того, что на самом деле является желаемым набором результатов.) – spencer7593