DB2 SQL - 选择与另一个表相关的表的所有值

时间:2018-02-06 04:38:57

标签: sql join db2

也许我不清楚我要问的问题,所以这是我的问题:

我现在有三张桌子,比如UserUser RoleRole,它们相互引用:

User
========
USER_ID | USER_NAME 
1       | User A
2       | User B

User Role
========
USER_ID | ROLE_ID
1       | 1
1       | 2
2       | 1

Role
========
ROLE_ID | ROLE_NAME
1       | Admin
2       | Supervisor

如您所见,User A目前有两个角色:AdminSupervisor 我现在要做的是选择角色为Admin的所有用户,然后sql结果也应显示与该用户相关的所有其他角色。

说,sql的执行方式如下: select A.*, C.ROLE_NAME from User A, User Role B, Role C where A.USER_ID = B.USER_ID and B.ROLE_ID = C.ROLE_ID and B.ROLE_ID = '1'

上述sql只应显示User A只有一个角色Admin

USER_ID | USER_NAME | ROLE_NAME
1       | User A    | Admin
2       | User B    | Admin

但我想要的是,在Admin旁边,sql结果还应该显示User A ROLE_NAME = Supervisor

USER_ID | USER_NAME | ROLE_NAME
1       | User A    | Admin
1       | User A    | Supervisor
2       | User B    | Admin

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用with ur as ( select u.*, C.ROLE_NAME from User u join User_Role ur on u.user_id = ur.user_id join Role r on r.role_id = ur.role_id ) select ur.* from ur where exists (select 1 from ur ur2 where ur2.user_id = ur.user_id and ur2.role_name = 'admin' );

FROM

此外,从不JOIN子句中使用逗号。 始终使用ON子句中的条件使用正确的stack语法。

其次,使用有意义的表别名而不是任意字母,例如" a"," b"和" c"。