首页 > 解决方案 > 将过滤条件放在 join on 语句中是否等效?

问题描述

我一直认为以下形式的陈述

SELECT * FROM A LEFT JOIN B ON (A.column1 = B.column2 AND B.column2 = 12321)

总是等价于

SELECT * FROM A LEFT JOIN B ON (A.column1 = B.column2)
WHERE B.column2 = 12321

更笼统地说:

SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY AND FILTER_ON(B))
WHERE FILTER_ON(A)

应该相当于

SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY)
WHERE FILTER_ON(A) AND FILTER_ON(B)

情况似乎并非如此……第一种类型提供的结果行数比第二种类型多。

问题:在哪些情况下我的假设是错误的?

标签: sqloracle

解决方案


不,对于外连接,它们是不等价的。

Aleft join保留第一个表中的所有行,无论on子句的计算结果是 true、false 还是NULL。因此,on仅在第一个表上的条件无效。

如果要过滤 a 中的第一个left join,请将条件放在where. 第二个表上的条件通常放在on子句中。


推荐阅读