我有一个表格,使用户属于部门1。用户b属于部门1.用户a具有链接到权利x,y,z(在另一个表中(。用户B没有权利。
我想获得用户b的权利,以便当null然后返回用户a的权利,因为他们在同一部门之下!当用户B具有权利时,返回仅找到权利,以便用户A和用户B具有不同的权利。因此,没有权利意味着获得团体权利,否则请保留特定的权利。
到目前为止,我到了简单地通过左JOIN为用户b为null提供零。我希望用户B返回用户A的相同结果A。
,因此有两种可能的情况:
- 用户有权利。您想向用户显示这些权利。
- 用户没有权利。您想显示用户部门用户的所有权利。
这有点奇怪,但是...您已经知道如何离开加入用户的权利。无效的右边意味着用户没有权利。在这种情况下,您想加入部门权利 - 另一个外部加入。
select u.userid, coalesce(ur.right, dr.right)
from users u
left join rights ur on ur.userid = u.userid
left join
(
select distinct u.deptid, r.right
from users u
join rights r on r.userid = u.userid
) dr on ur.right is null and dr.deptid = u.deptid;
使用子查询的其他查询,您应该用所需的用户ID替换值 2 :
SELECT
Rights.userid, Rights.rightname
FROM
Rights
WHERE
Rights.userid IN (
IF(
(SELECT COUNT(*) FROM Rights WHERE Rights.userid = 2)>0 ,
2,
(SELECT
GROUP_CONCAT(Users.id SEPARATOR ', ')
FROM Users
WHERE depart LIKE (SELECT Users.depart FROM Users WHERE Users.id = 2)
GROUP BY Users.depart
))
);
SQL小提琴中的完整代码
我只会做:
select r.*
from rights r
where r.user = 'B'
union all
select r.*
from rights r
where r.user = 'A' and
not exists (select 1 from rights r2 where r2.user = 'B');
这是我理解的方式:某些用户拥有哪个用户,因为来自同一部门的所有用户都具有相同的权利。如果是这样的话,这是一个选择:我创建了虚拟表(没有约束或其他列(只是为了显示我的意思。它是在Oracle上执行的,但应该在其他地方可以,至少是我希望如此(。如果您的数据库不支持带有分解子句,则只需将选择的选择转移到内联视图中即可。如果您不知道如何,请这样说。
SQL> create table users (id_user varchar2(1), id_dept number);
Table created.
SQL> create table rights (id_user varchar2(1), id_right varchar2(1));
Table created.
SQL> insert all
2 into users values ('A', 1)
3 into users values ('B', 1)
4 into users values ('C', 2)
5 into rights values ('A', 'x')
6 into rights values ('A', 'y')
7 into rights values ('C', 'z')
8 select * From dual;
6 rows created.
SQL>
SQL> with dept_rights as
2 (select distinct u.id_dept, r.id_right
3 from users u join rights r on r.id_user = u.id_user
4 )
5 select u.id_user, dr.id_right
6 from users u join dept_rights dr on dr.id_dept = u.id_Dept
7 order by 1, 2;
ID_USER ID_RIGHT
---------- ----------
A x
A y
B x
B y
C z
SQL>