Запрос на получение сотрудника разных отделов - PullRequest
0 голосов
/ 14 июня 2019

У меня есть 3 таблицы: Employee, Department и employeeProject.

Соотношение между employee и employeeproject одно-ко-многим. Соотношение между employee и department много-к-одному.

Я хочу написать запрос для выбора 10 сотрудников, которые работали в проектах 3 и 4. Запрос должен возвращать сотрудников различных отделов, если это возможно.

Запрос ниже вида работ. Единственная проблема заключается в том, что отношения между employee и employeeproject являются однозначными, поэтому он может возвращать один и тот же номер сотрудника несколько раз.

Я не могу использовать distinct, потому что все поля в предложении order by должны использоваться в select при использовании distinct.

select top 10 empid from employee e 
inner join department d on d.depId=e.depid
inner join employeeProject p on p.empid=e.empid
where p.projectID in (3,4)
order by row_number() over(partition by e.depId order by e.empid)

Ответы [ 3 ]

0 голосов
/ 14 июня 2019

Я предлагаю агрегировать по сотрудникам, а затем с помощью утверждения предложение HAVING:

SELECT TOP 10 e.empid
FROM employee e 
INNER JOIN department d
    ON d.depId = e.depid
INNER JOIN employeeProject p
    ON p.empid = e.empid
WHERE
    p.projectID IN (3,4)
GROUP BY
    e.empid
HAVING
    MIN(p.projectID) <> MAX(p.projectID);

Если минимальное и максимальное значения projectID равны не для данного сотрудника, после ограничения только проектами 3 и 4, это означает, что этот сотрудник соответствует критериям.

0 голосов
/ 14 июня 2019

Почему бы просто не использовать select distinct?

select distinct top 10 empid
from employee e inner join
     employeeProject p
     on p.empid = e.empid
where p.projectID in (3, 4)
order by row_number() over (partition by e.depId order by e.empid);

Обратите внимание, что таблица отдела не нужна.

В качестве альтернативы,

select top (10) e.*
from employee e
where exists (select 1
              from employeeprojects ep
              where p.emdid = e.empid and
                    p.projectid in (3, 4)
             )
order by row_number() over (partition by e.depid order by newid());
0 голосов
/ 14 июня 2019

Немного догадка, но используйте EXISTS?

SELECT TOP 10 e.empid
FROM employee e
     JOIN department d ON e.depid = d.depid
WHERE EXISTS (SELECT 1
              FROM employeeproject p
              WHERE p.emdid = e.empid
                AND p.projectid IN (3,4))
ORDER BY e.depid, e.empid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...