Есть ли способ сделать этот SQL более эффективным? - PullRequest
2 голосов
/ 16 февраля 2011

Рассмотрим следующие таблицы:

отдел

deptid      (type:INT)
deptname    (type: TEXT)
hours       (type:INT)
active      (type:BIT)

работник

empid       (type:INT)
empname     (type: TEXT)
deptid      (type: INT)
designation (type: TEXT)
salary      (type: INT)

Написать запрос на возврат столбцов empname и deptname сотрудников, принадлежащих отделы, которые имеют количество сотрудников 4 или более. Записи должны быть возвращены в алфавитном порядке empname

Это был мой дубль:

SELECT e1.empname, d.deptname from employee AS e1
FULL JOIN department AS d on e1.deptid = d.deptid
  WHERE e1.deptid IN(
    SELECT deptid FROM(
      SELECT e2.deptid, COUNT(e2.empid)
      FROM employee AS e2
      GROUP BY e2.deptid
      HAVING COUNT(e2.empid) >= 4
    )
  )
ORDER BY empname;

Как бы вы улучшили это?

Ответы [ 2 ]

5 голосов
/ 17 февраля 2011

Это короче и, вероятно, работает быстрее

SELECT e1.empname, d.deptname
from (
      SELECT e2.deptid
      FROM employee AS e2
      GROUP BY e2.deptid
      HAVING COUNT(e2.empid) >= 4
    ) G
inner join employee AS e1 on e1.deptid = G.deptid
INNER JOIN department AS d on d.deptid = G.deptid
ORDER BY e1.empname;

Начните с группировки. Вам не нужно COUNT из внутреннего запроса. Затем присоединитесь к обеим таблицам, чтобы получить имена.

INNER JOIN используется, потому что как только счет завершен, мы уже знаем, что

  1. сотрудники существуют
  2. отдел существует
0 голосов
/ 05 марта 2019

Попробуйте этот запрос, он будет работать правильно.

select empname,deptname from employee,department
where 
employee.deptid=department.deptid and employee.deptid
in
(
  select deptId from employee group by deptid having count(*)>=4
) 
order by empname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...