SQL查询问题

时间:2009-11-26 20:14:00

标签: sql database oracle sql-match-all

考虑两个table.Employee和Project.Employee表有像eid,ename这样的字段。项目表有像pid,pname.Now这样的字段,因为员工可以处理很多项目,项目可以由很多员工完成,因此很明显,两个表有很多对多关系。打破多对多,并创建一个名为Assignment的新表,它包含eid和pid的外键。

这是一个问题,我想找出那些在一个以上项目中相互合作的员工对。例如,如果emp A和emp B在多个项目中相互合作,那么他们就有资格获得以上查询结果。

请让我知道上述问题的查询内容。

3 个答案:

答案 0 :(得分:8)

这是一个非常常见且直截了当的解决方案:

SELECT a1.eid, a2.eid
FROM Assignment a1
JOIN Assignment a2 ON (a1.eid < a2.eid AND a1.pid = a2.pid)
GROUP BY a1.eid, a2.eid
HAVING COUNT(*) > 1;

此查询执行连接以将Assignment表中的行与同一项目中具有相同项目和不同员工的其他行匹配。我们使用<来比较员工ID,因此我们不会获得重复配对。

然后我们使用GROUP BY来确保每对员工只有一行。

HAVING子句仅选择具有多行的组,这些组是一起处理多个项目的员工对。

答案 1 :(得分:1)

这可以帮到你吗?

select ass1.eid, ass2.eid 
from Assignment ass1         
join Assignment ass2 on ass1.pid = ass2.pid
where ass1.eid < ass2.eid
group by ass1.eid, ass2.eid
having COUNT(0) > 1

答案 2 :(得分:1)

这就是我写它的方式,与Bill写的很相似,区别在于计算不同项目,以防关系表中没有唯一约束(emp_id,prj_id):

SELECT r1.emp_id, r2.emp_id, COUNT(DISTINCT r1.prj_id) cntProjects
  FROM r_emp_prj r1, r_emp_prj r2
 WHERE r1.emp_id < r2.emp_id
   AND r2.prj_id = r1.prj_id
 GROUP BY r1.emp_id, r2.emp_id HAVING COUNT(DISTINCT r1.prj_id) > 1

如果关系表还存储项目中人员的角色(dev,lead,q&amp; a等),则可以在关系表中为同一(emp_id,prj_id)对提供多个条目。


这也会检索名称:

SELECT r1.emp_id, emp1.name,
       r2.emp_id, emp2.name,
       COUNT(DISTINCT r1.prj_id) cntProjects
  FROM r_emp_prj r1, r_emp_prj r2,
       emp emp1, emp emp2
 WHERE r1.emp_id < r2.emp_id
   AND r2.prj_id = r1.prj_id
   AND emp1.id = r1.emp_id
   AND emp2.id = r2.emp_id
 GROUP BY r1.emp_id, emp1.name, r2.emp_id, emp2.name
HAVING COUNT(DISTINCT r1.prj_id) > 1