子查询

时间:2016-03-04 04:48:17

标签: mysql join syntax subquery

我发现在使用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克劳则可以访问。为什么会这样,任何人都可以指出文档中的内容在哪里?

编辑:删除了涉及过早优化的不需要的背景信息。

2 个答案:

答案 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);

- MySQL docs, 13.2.9.2 JOIN Syntax

答案 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?