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是一样的效果
总结完毕,谢谢~