具有设置差异功能的sql

时间:2014-07-30 19:25:27

标签: sql db2

假设我有这两个带有样本数据的表:

Employee Table

Employee_Roles Table

我想找到哪些员工没有这个角色说5330.答案应该是员工2& 3。

如果我只是尝试使用employee_roles进​​行员工左外连接,其中role_id<> 5330它也包括员工1,但情况并非如此。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

您可以使用Where Not Exists

执行此操作
Select  e.*
From    employee    e
Where Not Exists
(
    Select  1
    From    employee_roles  r
    Where   r.employee_id = e.employee_id
    And     r.role_id = 5330
)

答案 1 :(得分:1)

以下是left outer join版本的语法:

select e.*
from employee e left outer join
     employee_roles er
     on er.employee_id = e.employee_id and er.role_id = 5330
where er.employee_id is null;

逻辑是您使用left outer join查找匹配项并返回没有匹配项的行。 role_id条件中的条件非常重要,而不是on条款而非where条款。

您还可以使用NOT EXISTSNOT IN来填充此查询。

答案 2 :(得分:1)

DB2支持EXCEPT运算符,对吗?因此,这将为每个没有角色5330的员工提供employee_id。

select employee_id 
from employee_roles
except 
select employee_id
from employee_roles
where role_id = 5330;

您可以将该结果集加入"员工"如果你需要他们的名字,可以获取他们的名字。

答案 3 :(得分:0)

有两种方法可以做到这一点:

Select e.employee_name
From employee
Where employee_id Not In
    (Select distinct employee_id 
     From employee_roles 
     where role_id = 5330)

Select e.employee_name
From employee e
Where Not exists
    (Select * From employee_roles 
     where employee_id = e.employee_id
         and role_id = 5330)