我发现在使用ON和WHERE过滤带有连接的子查询之间的mysql中存在一个奇怪的差异。
此查询运行良好:
SELECT * FROM cobrand co WHERE co.id IN (
SELECT co2.id FROM cobrand co3 INNER JOIN cobrand co2
ON co2.id = co3.id + 1
WHERE co2.id = co.id
)
但是这个返回错误Unknown column 'co.id' in 'on clause'
:
SELECT * FROM cobrand co WHERE co.id IN (
SELECT co2.id FROM cobrand co3 INNER JOIN cobrand co2
ON co2.id = co3.id + 1
AND co2.id = co.id
)
显然,子查询的ON子句无权访问外部查询的别名,而WHERE克劳则可以访问。为什么会这样,任何人都可以指出文档中的内容在哪里?
编辑:删除了涉及过早优化的不需要的背景信息。
答案 0 :(得分:1)
以前,ON子句可以引用名为to的表中的列 这是正确的。现在一个ON子句只能引用它的操作数。
示例:
CREATE TABLE t1 (i1 INT); CREATE TABLE t2 (i2 INT); CREATE TABLE t3 (i3 INT); SELECT * FROM t1 JOIN t2 ON (i1 = i3) JOIN t3;
以前,SELECT语句是合法的。现在声明失败了 使用未知列' i3'在' on条款'因为i3是一个错误 t3中的列,它不是ON子句的操作数。该声明 应该改写如下:
SELECT * FROM t1 JOIN t2 JOIN t3 ON (i1 = i3);
答案 1 :(得分:0)
where子句适用于整个结果集。
on子句仅适用于查询中的连接。
请参阅以下链接
What's the difference between where clause and on clause when table left join?
In SQL / MySQL, what is the difference between "ON" and "WHERE" in a join statement?