`
ayagen
  • 浏览: 12636 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

由TOPLINK中anyOfAllowingNone引发的OUTER JOIN(LEFT, RIGHT, FULLY)复习总结

阅读更多
1. SELF JOIN

 SELECT A.FUNCTION_CODE, ' is parent of :', B.FUNCTION_CODE
   FROM FUNCTION A, FUNCTION B
  WHERE A.CODE = B.PARENT_CODE
  ORDER BY A.CODE


2. INNER JOIN = JOIN

3. LEFT JOIN
 其实就是INNER JOIN之后把左边表中不匹配的RECORD全部加入到结果集.

4. RIGHT JOIN (理解同上)

5. OUTER JOIN
   INNER JOIN之后再把两张表中没有JOIN成功的RECORD全部加进来,可以理解为LEFT JOIN和RIGHT JOIN的并集

-----------------------------------------
ORACLE中:
找出所有的用户姓名及其所属于的组(包括那些不属于任何组的用户)
LEFT JOIN实现:
SELECT U.NAME, G.* FROM USER U LEFT JOIN USER_GROUP_ASSO G ON U.LOGIN_ID = G.LOGIN_ID


与其等价的写法:
SELECT U.NAME, G.* FROM USER U, USER_GROUP_ASSO G
WHERE U.LOGIN_ID = G.LOGIN_ID(+)

这里的'(+)'表示结果集中G.LOING_ID可以为空.也就是要把那些在表G中不存在的LOGIN_ID 也加到结果集中.

JOIN条件已被精确指定时(等于某个查询值),这时候用外连接是没有什么意义的.比如我们要找到用户jack所属于的所有的组,这时候如果用:
SELECT U.NAME, G.* FROM USER U, USER_GROUP_ASSO G
WHERE U.LOGIN_ID = G.LOGIN_ID(+)
AND U.LOGIN_ID = 'jack'

其实是没什么意义的,因为JOIN条件LOGIN_ID已经被精确指定为'jack',所以G.LOGIN_ID后面的(+)就有点多余了.

如果查询的是所有年龄为30岁的用户及其所属于的组(包括那些不属于任何组的),则这个(+)还是有用的:当存在不属于任何组的用户时,有(+)则可能会比没用(+)多出一些纪录
SELECT U.NAME, G.* FROM USER U, USER_GROUP_ASSO G
WHERE U.LOGIN_ID = G.LOGIN_ID(+)
AND U.AGE = 30


但如果过滤条件是用表G中的COLUMN,那用(+)也是没有任何意义的了.

NOT EXISTS 实现(只找到那些不属于任何组的用户):
SELECT U.NAME FROM USER U
WHERE NOT EXISTS( SELECT 1 FROM USER_GROUP_ASSO A WHERE A.LOGIN_ID = U.LOGIN_ID)

*回到问题的起始点:
需要找到用户名为admin的用户所属于的所有组(USER->GROUP : 多对多)
TOPLINK中可以用anyOf和anyOfAllowingNone来实现:
其中anyOf是内连接,也就是普通的JOIN操作,不用多解释;
anyOfAllowingNone则是外连接,其后面的参数所对应的COLUMN在最后结果集中是允许为空的.
无代码无真相:(builder建立在表GROUP上)
builder.anyOf('users').get('loginId').equal('admin')
builder.anyOfAllowingNone('users').get('loginId').equal('admin')

显然这里用anyOfAllowingNone没什么作用,和anyOf是一样的效果

总结完毕,谢谢~

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics