SQL左JOIN复制不存在的结果以null结果



我有一个表格,使用户属于部门1。用户b属于部门1.用户a具有链接到权利x,y,z(在另一个表中(。用户B没有权利。

我想获得用户b的权利,以便当null然后返回用户a的权利,因为他们在同一部门之下!当用户B具有权利时,返回仅找到权利,以便用户A和用户B具有不同的权利。因此,没有权利意味着获得团体权利,否则请保留特定的权利。

到目前为止,我到了简单地通过左JOIN为用户b为null提供零。我希望用户B返回用户A的相同结果A。

,因此有两种可能的情况:

  1. 用户有权利。您想向用户显示这些权利。
  2. 用户没有权利。您想显示用户部门用户的所有权利。

这有点奇怪,但是...您已经知道如何离开加入用户的权利。无效的右边意味着用户没有权利。在这种情况下,您想加入部门权利 - 另一个外部加入。

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>

最新更新