\' 模棱两可的列 \' 错误意味着对列标识符有一个引用,并且 MySQL 有两个(或更多)可能的列符合规范。
句中列 CategoryID
的引用 WHERE
。
是指 CategoryID
来自的列 CategoryID
,或是指 cat
来自的列 CategoryID
,这是\'模棱两可\'的 p
.
解决方法是使用 引用 以消除歧义。也就是说,代替 Categ或yID
,指定 cat.CategoryID
or 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
(Category) 表 CategoryID
中的列 cat
的值 (Product) 表 中的列 CategoryID
的值 p
匹配
此外,最佳做法是 使用表的名称或表别名来限定查询中引用的 所有 Name
中的列 ORDER BY
。
这样做的一个很大的好处是,如果(在未来的某个时间)将一个名为的列 Name
添加到 Products
表中,则带有未限定引用的查询 Name
将开始针对该引用抛出“不明确的列”错误。因此,限定所有列名可避免在将新列添加到现有表时导致工作查询“中断”。
另一个很大的好处是,对于语句的读者来说。MySQL 可以非常快速地在字典中查找该列在哪个表 Name
中。但是,如果 SQL 语句的读者(比如我自己)不知道哪个表包含名为的列 Name
,则还需要查看表定义才能找到答案。如果名称符合条件,我们就已经知道该列来自哪个表。