BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #5305同步于 2011/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

关于predicate 写在 on 和 where 后面的区别

Robberking
2011/3/18镜像同步1 回复
前几天看到有人问 prediacete 写在 on 后面 和 where 后面的区别,我询问了一下做 parser 的同事,得到如下结论 对于 predicate ,apply 的有三种情况, before join, during join, after join. 对于 inner join 没有任何的区别,所有的 predicate 的应用都是 during join. 对于 outer join, on 后面的 predicate 只能是 before join 或者 during join. where 后面的 predicate 只能是 during join 或者 after join. 测试如下: CREATE TABLE TU2(C1 INT,C2 INT); INSERT INTO TU2 VALUES(1, 2); INSERT INTO TU2 VALUES(2, 3); CREATE TABLE TU11(C1 INT,C2 INT); INSERT INTO TU11 VALUES(1, 5); INSERT INTO TU11 VALUES(1, 4); Case 1: SELECT * FROM TU2 LEFT OUTER JOIN TU11 ON TU2.C1 = TU11.C1 WHERE TU11.C2=4 1 2 1 4 这个是一个 after join, 先apply join,然后apply TU11.C2=4 Case 2: SELECT * FROM TU2 LEFT OUTER JOIN TU11 ON TU2.C1 = TU11.C1 AND TU11.C2=4 1 2 1 4 2 3 NULL NULL 这个是一个 before join, 先 apply TU11.C2=4,之后 apply join, 所以就多出了 2 3 null null Case3: SELECT * FROM TU2 LEFT OUTER JOIN TU11 ON TU2.C1 = TU11.C1 OR TU11.C2=4 C1 C2 C1 C2 --- --- --- --- 1 2 1 5 1 2 1 4 2 3 1 4 这个是一个 during join, join 和 local 一起 apply .
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
doubleKO机器人#1 · 2011/3/18
赞一个~ 不过不太习惯中英文混杂的解释 关于外连接,找到一篇文章,据说“让您更加容易地理解和使用 SQL 语言强大的外连接功能” http://www.ibm.com/developerworks/cn/data/library/techarticles/0112purcell/0112purcell.html 【 在 Robberking (Kinh) 的大作中提到: 】 : 前几天看到有人问 prediacete 写在 on 后面 和 where 后面的区别,我询问了一下做 parser 的同事,得到如下结论 : 对于 predicate ,apply 的有三种情况, before join, during join, after join. : 对于 inner join 没有任何的区别,所有的 predicate 的应用都是 during join. : ...................