复杂查询 - 检索在两个特定部门工作的员工

Complex query - retrieve employees working in both two specific departments

我正在尝试找出一种方法来检索在两个不同部门工作的员工。

我有 3 个简单的表格:

所以我试着写了一个 SQL 查询:

 select employee_name
 from employee, working,department
 where eid = employee_id 
   and did = department_id 
   and department_name = 'software'
   and dname = 'hardware';

但是它不起作用,我的问题是什么?

您可以轻松获取在某一特定部门工作的员工:

select *
  from Employee e inner join
       Working w on e.employee_id = w.eid inner join
       Department d on w.did = d.department_id
 where d.name = 'software'

现在暧昧来了。如果你想让所有员工工作 software hardware:

-- Employees who work at either software or hardware or both departments
select *
  from Employee e inner join
       Working w on e.employee_id = w.eid inner join
       Department d on w.did = d.department_id
 where d.name = in ('software', 'hardware')

如果你想获得在softwarehardware部门工作的员工:

-- Employees who work in both hardware and software deparments simultaneously 
select *
  from Employee e inner join
       Working w on e.employee_id = w.eid inner join
       Department d on w.did = d.department_id
 where d.name = 'software'

intersect

select *
  from Employee e inner join
       Working w on e.employee_id = w.eid inner join
       Department d on w.did = d.department_id
 where d.name = 'hardware'

问题是您要求部门同时为 'software' 和 'hardware'。另外,dname 不是字段。

更正您的查询:

select employee_name
from employee, working, department
where eid = employee_id and did = department_id 
and (department_name = 'software' or department_name = 'hardware');

但我更喜欢这种查询:

SELECT DISTINCT e.employee_name
FROM employee e
JOIN working w ON w.eid = e.employee_id
JOIN department d ON d.department_id = w.did
WHERE d.department_name IN ('software', 'hardware');

也就是让员工在两个部门中的任何一个(或两个)工作。

如果您只想要同时在两个部门工作的员工,试试这个:

SELECT e.employee_id, e.employee_name
FROM employee e
JOIN working w ON w.eid = e.employee_id
JOIN department d ON d.department_id = w.did
WHERE d.department_name IN ('software', 'hardware')
GROUP BY e.employee_id HAVING COUNT(DISTINCT d.department_id) = 2;

What is my problem?

您的 table 中没有 dname 列。


您可以简化问题,因为您不需要 department table,因为 working table 包含 did 中的部门 ID列。

然后你需要 GROUP BY 每个员工并找到 HAVING 一个 COUNT 两个 DISTINCT 部门 ID:

SELECT MAX(e.employee_name)
FROM   employee e
       INNER JOIN working w
       ON e.employee_id = w.eid
GROUP BY e.employee_id
HAVING COUNT(DISTINCT w.did) = 2

如果您只想考虑 softwarehardware 部门,那么:

SELECT MAX(e.employee_name)
FROM   employee e
       INNER JOIN working w
       ON e.employee_id = w.eid
       INNER JOIN department d
       ON w.did = d.department_id
WHERE  d.department_name IN ('software', 'hardware')
GROUP BY e.employee_id
HAVING COUNT(DISTINCT w.did) = 2

这样的事情对你有用吗?

SELECT
   count(*) as cnt,
   employee.employee_name
FROM
   employee
   JOIN working ON working.eid = employee.employee_id
   JOIN department ON department.department_id = working.did
WHERE
   department.department_name = 'software' or department.department_name = 'hardware'
GROUP BY employee.employee_name
HAVING cnt > 1

这将计算链接到软件或硬件部门的每位员工。或者您可以不使用 WHERE 子句,让所有员工在多个部门工作。