我总是假设以下形式的陈述
SELECT * FROM A LEFT JOIN B ON (A.column1 = B.column2 AND B.column2 = 12321)
Run Code Online (Sandbox Code Playgroud)
总是等价于
SELECT * FROM A LEFT JOIN B ON (A.column1 = B.column2)
WHERE B.column2 = 12321
Run Code Online (Sandbox Code Playgroud)
更笼统地说:
SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY AND FILTER_ON(B))
WHERE FILTER_ON(A)
Run Code Online (Sandbox Code Playgroud)
应该相当于
SELECT * FROM A LEFT JOIN B ON (FOREIGN-KEY)
WHERE FILTER_ON(A) AND FILTER_ON(B)
Run Code Online (Sandbox Code Playgroud)
情况似乎并非如此...第一种类型提供的结果行数比第二种类型多。
问题:在哪些情况下我的假设是错误的?
不可以。对于外连接,它们不是等价的。
Aleft join保留第一个表中的所有行,无论该on子句的计算结果是 true、false 还是NULL。因此,on仅第一个表中的条件无效。
如果要过滤 a 中的第一个表left join,请将条件放在where. 第二个表上的条件通常在on子句中。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |