也许我不清楚我要问的问题,所以这是我的问题:
我现在有三张桌子,比如User
,User Role
,Role
,它们相互引用:
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
目前有两个角色:Admin
和Supervisor
我现在要做的是选择角色为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
有什么想法吗?
答案 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"。