Проблема SQL-запроса - PullRequest
       14

Проблема SQL-запроса

2 голосов
/ 26 ноября 2009

Рассмотрим две таблицы. В таблице Employee и Project.Employee есть поля, такие как eid, ename.Project, в таблице есть поля, такие как pid, pname.Now, поскольку сотрудник может работать над многими проектами, и поэтому проект может выполняться многими сотрудниками, поэтому Как видно, между двумя таблицами существует отношение «многие ко многим». Приведите множество ко многим и создайте новую таблицу под названием «Назначение», которая состоит из внешних ключей eid и pid.

Вот вопрос, я хочу выяснить, какие пары сотрудников работали друг с другом в более чем 1 проекте. Например, если emp A и emp B работали друг с другом более чем в одном проекте, тогда они имеют право на результат запроса выше.

Пожалуйста, дайте мне знать, что будет запрос для указанной проблемы.

Ответы [ 3 ]

8 голосов
/ 26 ноября 2009

Вот довольно распространенное и простое решение:

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 с другими строками в той же таблице с тем же проектом и другим сотрудником. Мы используем < для сравнения идентификаторов сотрудников, поэтому мы не получаем дублирующиеся пары.

Затем мы используем GROUP BY, чтобы убедиться, что для каждой пары сотрудников есть только один ряд.

Предложение HAVING выбирает только те группы, которые имеют несколько строк, которые представляют собой пары сотрудников, которые работали над несколькими проектами вместе.

1 голос
/ 27 ноября 2009

Вот как я бы это написал, очень похоже на то, что написал Билл, с разницей в подсчете отдельных проектов в случае отсутствия уникального ограничения на (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
1 голос
/ 26 ноября 2009

Это может вам помочь?

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
...