Как структурировать этот запрос SELECT? - PullRequest
0 голосов
/ 08 декабря 2011

В MS SQL Server, используя следующие данные, как мне найти empIds, у которых коэффициент 10 завершен (= 1) и нет записи для отдела 11?

deptId    empId   complete
10         3         1
11         3         0
10         4         1
10         5         1
11         5         0
12         5         1
10         6         1
10         7         1
11         7         0

Это должно вернуть empIds 4 и 6.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Ответ:

select distinct empId
from employees e
where e.deptId= 10 and complete = 1
and e.emId not in
  (select s_e.empId
   from employees s_e 
   where s_e.deptId = 11
   )

запрос представляет собой список сотрудников, которые завершили 10 отдел (= 1)

подзапрос - это список сотрудников, в котором есть запись для dept11.

С CTE:

WITH employees_excluded_CTE (idEmp)
AS
(
   select s_e.empId
       from employees s_e 
       where s_e.deptId = 11
)
 select distinct empId
    from employees e
    where e.deptId= 10 and complete = 1
    and e.emId not in
      (select s_e.empId
       from employees_excluded_CTE
       );
GO
1 голос
/ 08 декабря 2011

Когда это возможно, в таких случаях я пытаюсь написать логику, которая должна анализировать данные только один раз.вот пара.Точная форма зависит от характера ваших данных (дубликатов и т. Д.) И / или индексов, которые вы имеете или можете создать.

Самый универсальный (все в HAVING MAX(CASE WHEN THEN) = 0)

SELECT
  empID
FROM
  yourTable
WHERE
  deptId IN (10,11)  -- The only two that matter to your logic
GROUP BY
  empID
HAVING
  MAX(CASE WHEN deptId = 11                  THEN 1
           WHEN deptId = 10 AND complete = 0 THEN 1
                                             ELSE 0
      END) = 0

Более конкретно, менее обобщенно:

SELECT
  empID
FROM
  yourTable
WHERE
  (deptId = 10 AND completed = 1)
  OR
  (deptId = 11)
GROUP BY
  empID
HAVING
  MAX(deptId) = 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...