【发布时间】:2019-02-12 12:10:08
【问题描述】:
我一直假设以下形式的陈述
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)
情况似乎并非如此...第一种类型提供的结果行数比第二种类型多。
问题:在哪些情况下我的假设是错误的?
【问题讨论】:
-
学习 SQL 的最佳方式是编程。创建表,插入一些数据,看看是否有区别! (提示:有。将右侧表条件放在 ON 子句中,否则会得到常规的内连接结果。)
-
最好的理解方式是:在查询中只显示匹配where条件的记录——反之,如果左连接条件不匹配,则显示记录,但是左连接表有一个空行...(如果您使用普通连接(没有左连接),那么这两个语句是等价的,但对于左连接、右连接或全连接不适用。)
-
@jarlh 我不认为这个问题值得 go-and-learn-sql-first 评论。 Mathtec,欢迎加入!