SQL:检索所有已加入的记录

时间:2017-09-17 01:14:14

标签: sql oracle

抱歉,想不出一个更好的头衔。

我在Oracle XE中有3个表。 EMPLOYEE表是PROJECT表和WORK_ON表。员工可以参与许多项目。我正在尝试获取正在处理所有项目的员工姓名。

EMPLOYEE Table
Emp_ID   EMP_Name
1        Esther
2        Peter
3        Joan
4        Roger
5        Liam

PROJECT Table
Project_ID
1
2
3

WROKS_ON Table
Emp_ID       Project_ID
1            3
2            1
2            2
2            3
3            1
3            2
4            1
4            2
4            3

根据字段,我的结果应该是 Peter Roger

从以下开始,但卡住了:

SELECT EMP_NameLOYEE.E_NAME
FROM EMP_NameLOYEE INNER JOIN 
(PROJECT INNER JOIN WROKS_ON ON PROJECT.Project_ID = WROKS_ON.Project_ID) ON 
EMP_NameLOYEE.Emp_ID = WROKS_ON.Emp_ID
WHERE WROKS_ON.Project_ID In (SELECT DISTINCT Project_ID FROM PROJECT);

显然,这会检索正在处理每个项目重复的员工的所有名称,但不完全是我想要的。

2 个答案:

答案 0 :(得分:1)

您需要使用cross joinleft join工作表生成员工和项目的所有组合,并检查每个e_name的行数。

SELECT e.E_NAME
FROM EMPLOYEE e
CROSS JOIN PROJECT p
LEFT JOIN WORKS_ON w ON p.Project_ID = w.Project_ID and e.emp_id=w.emp_id
GROUP by e.E_NAME
HAVING COUNT(*)=COUNT(w.project_id)

答案 1 :(得分:1)

您可以将项目表排除在外。

SELECT e.emp_id, COUNT(project_id)
FROM employee e
INNER JOIN works_on wo ON wo.emp_id = e.emp_id
GROUP BY e.emp_id
HAVING COUNT( project_id ) = (SELECT COUNT(*) FROM project);

SQL Fiddle