2

2 つの table.Employee と Project.Employee テーブルには eid、ename などのフィールドがあります。Project テーブルには pid、pname などのフィールドがあります。従業員は多くのプロジェクトに取り組むことができ、プロジェクトは多くの従業員によって実行される可能性があるため、明らかなように、2 つのテーブルには多対多の関係があります。多対多を分割し、eid と pid を外部キーとして構成する Assignment という新しいテーブルを作成します。

ここに質問があります。複数のプロジェクトで互いに協力した従業員のペアを見つけたいです。たとえば、従業員 A と従業員 B が複数のプロジェクトで互いに協力した場合、上記のクエリの資格があります。結果。

上記の問題のクエリが何であるかを教えてください。

4

3 に答える 3

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、従業員のペアごとに1つの行しかないことを確認するために使用します。

このHAVING句は、複数のプロジェクトに一緒に取り組んだ従業員のペアである、複数の行を持つグループのみを選択します。

于 2009-11-26T20:28:46.880 に答える
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
于 2009-11-26T20:32:05.470 に答える
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&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
于 2009-11-26T21:43:18.943 に答える