SQL查询问题

SQL查询问题,sql,database,oracle,sql-match-all,Sql,Database,Oracle,Sql Match All,考虑两个表。Employee和Project。Employee表有像eid、ename这样的字段。Project表有像pid、pname这样的字段。现在,由于一个员工可以处理多个项目,而一个项目可以由多个员工完成,因此,很明显,这两个表之间存在多对多关系。打破多对多,并创建一个名为Assignment的新表,该表由eid和pid作为外键组成 这里是一个问题,我想找出那些在一个以上项目中相互合作过的员工对。例如,如果emp A和emp B在多个项目中相互合作过,那么他们符合上述查询结果的条件 请告

考虑两个表。Employee和Project。Employee表有像eid、ename这样的字段。Project表有像pid、pname这样的字段。现在,由于一个员工可以处理多个项目,而一个项目可以由多个员工完成,因此,很明显,这两个表之间存在多对多关系。打破多对多,并创建一个名为Assignment的新表,该表由eid和pid作为外键组成

这里是一个问题,我想找出那些在一个以上项目中相互合作过的员工对。例如,如果emp A和emp B在多个项目中相互合作过,那么他们符合上述查询结果的条件


请告诉我对上述问题的查询。

这里有一个非常常见且简单的解决方案:

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;
选择a1.eid、a2.eid
来自作业a1
连接分配a2 ON(a1.eid
此查询执行联接,将
分配
表中的行与同一表中具有相同项目和不同员工的其他行进行匹配。我们使用
这能帮到你吗

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
选择ass1.eid、ass2.eid
来自分配助理1
ass1.pid=ass2.pid上的联接分配ass2
其中ass1.eid1的

我将这样写,与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
选择r1.emp\u id、r2.emp\u id、计数(不同的r1.prj\u id)项目
来自r_emp_prj r1,r_emp_prj r2
其中r1.emp\u id1
如果关系表还存储项目中人员的角色(开发、领导、q&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
选择r1.emp\u id,emp1.name,
r2.emp_id,emp2.name,
项目计数(不同的r1.prj_id)
来自r_emp_prj r1,r_emp_prj r2,
emp emp1,emp emp2
其中r1.emp\u id1

单用sql很难做到这一点。你有一个答案,这是一个很难回答的问题。你能帮助我理解这是如何工作的吗?
如果没有唯一性(eid,pid),那么计数(DISTINCT a1.pid)>0会有帮助;Gausie,前3行生成了一组[几乎]不同的员工对(eid,eid),他们在每个项目上工作。最后两行过滤掉只显示一次的对。@马吕斯:您使用
COUNT(DISTINCT)
是正确的,但我假设多对多交叉表对[eid,pid]有唯一的约束,OP没有说任何不同的含义。