复杂查询 - 检索在两个特定部门工作的员工
Complex query - retrieve employees working in both two specific departments
我正在尝试找出一种方法来检索在两个不同部门工作的员工。
我有 3 个简单的表格:
- 员工(employee_id、employee_name)
- 部门(department_id、department_name)
- 工作(开斋节,做了,work_time)
所以我试着写了一个 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')
如果你想获得在software
和hardware
部门工作的员工:
-- 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
如果您只想考虑 software
和 hardware
部门,那么:
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 子句,让所有员工在多个部门工作。
我正在尝试找出一种方法来检索在两个不同部门工作的员工。
我有 3 个简单的表格:
- 员工(employee_id、employee_name)
- 部门(department_id、department_name)
- 工作(开斋节,做了,work_time)
所以我试着写了一个 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')
如果你想获得在software
和hardware
部门工作的员工:
-- 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
如果您只想考虑 software
和 hardware
部门,那么:
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 子句,让所有员工在多个部门工作。