【发布时间】:2014-06-20 07:34:40
【问题描述】:
我想知道为什么以下两个查询会产生不同的结果(第一个查询的行数比第二个多)。
SELECT * FROM A
JOIN ...
JOIN ...
JOIN C ON ...
LEFT JOIN B ON B.id = A.id AND B.otherId = C.otherId
相对于:
SELECT * FROM A
JOIN ...
JOIN ...
JOIN C ON ...
LEFT JOIN B ON B.id = A.id
WHERE B.otherId = C.otherId
请帮助我理解。在第二个查询中,左连接只有一个条件,所以它不应该包括第一个查询的所有结果等等(额外的行有不匹配的otherId)。然后WHERE 子句应确保otherId 匹配,就像在第一个查询中一样。为什么它们不同?
【问题讨论】:
-
WHERE在执行JOIN之前首先由查询引擎执行。原因是为什么要加入,如果我们稍后要过滤一些行。查询引擎非常擅长优化您编写的查询。 -
您使用的
Where子句有效地将您的Outer Join更改为Inner Join。第一个将包含没有otherId匹配为Null的记录,但第二个将在Where过滤器中丢弃它们。