SQL将连接复制不存在的结果留给null结果

时间:2018-02-18 09:24:35

标签: sql sql-server database null left-join

我有一个表,用户A属于部门1.用户B属于部门1.用户A有权限x,y,z(在另一个表中)。用户B没有权利。

我希望获得用户B的权限,以便在null时返回用户A的权限,因为他们在同一个部门下!当用户B拥有权限时,则仅返回找到的权限,以便用户A和用户B具有不同的权限。所以没有权利意味着获得团体权利,否则保留特定权利。

到目前为止,我已经到了通过左连接简单地为用户B获取空的点。所以用户A具有权限而用户B具有空值。我希望用户B为用户A返回相同的结果。感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

所以有两种可能的情况:

  1. 用户拥有权利。您希望为用户显示这些权限。
  2. 用户没有权利。您希望在用户的部门中显示用户的所有权利。
  3. 这有点奇怪,但是......你已经知道如何离开加入用户的权利。空权利意味着用户没有权利。在这种情况下,您希望加入部门权利 - 另一个外部联接。

    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;
    

答案 1 :(得分:1)

使用子查询的其他查询,您应该将值 2 替换为所需的用户ID:

Subject

The complete code in SQL Fiddle

答案 2 :(得分:1)

我会这样做:

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');

答案 3 :(得分:0)

以下是我理解的方式:由于同一部门的所有用户共享相同的权限,因此某个用户的权利并不重要。如果是这样,这里有一个选项:我创建了虚拟表(没有约束或其他列)只是为了表明我的意思。它是在Oracle上执行的,但在其他地方应该可以(至少,我希望如此)。如果您的数据库不支持WITH因子子句,只需将该SELECT移动到内联视图中即可。如果您不知道如何,请说明。

$(function(){
  function signUpAgreeCheckedEventHandler(e) {
        e.preventDefault();
        e.stopPropagation();
    $('#signupConfirmPassword_js').attr('type','text')
        alert('--')
    }
  $('#signupConfirmPassword_js:after').click(signUpAgreeCheckedEventHandler)
})