Проблема с вложенным запросом

#sql #sql-server

#sql #sql-сервер

Вопрос:

Отдел(DepartID,DepName)

Сотрудники(Имя, DEPARTIDID)

Что мне нужно, так это количество сотрудников в отделе с именем DepName.

Ответ №1:

Если вы используете SQL Server версию 2005 или выше, вот еще один возможный способ подсчета сотрудников по отделам. .

 SELECT      DPT.DepName
        ,   EMP.EmpCount
FROM        dbo.Department DPT
CROSS APPLY (
                SELECT  COUNT(EMP.DepartId) AS EmpCount
                FROM    dbo.Employees EMP
                WHERE   EMP.DepartId = DPT.DepartId
            ) EMP           
ORDER BY    DPT.DepName
  

Надеюсь, это поможет.

Пример вывода тестового запроса:

Вывод

Ответ №2:

Я бы использовал outer join , а не подзапрос.

 SELECT d.DepName, COUNT(e.Name)
FROM Department d
LEFT JOIN Employees e ON e.DepartID = d.DepartID
GROUP BY d.DepartID, d.DepName
  

Комментарии:

1. Вложенный запрос лучше и позволяет избежать сортировки по DepName

2. @Magnus Скорее всего, DepartID это будет ключ PK / кластеризованного индекса и не потребует никакой сортировки. Редактировать: Это немного уклончивый ответ, хотя и интересный общий момент, я проведу несколько тестов.

3. Я полагаю, поскольку вы группируете как по DepartID, так и по DepName, а не только по DepName

4. @Magnus — SQL Server распознает, что при группировке по PK другие функционально зависимые столбцы сортировать не нужно.

Ответ №3:

 SELECT d.DepName, COUNT(e.Name)
    FROM Department d
        LEFT JOIN Employees e
            ON d.DepartID = e.DepartID
    GROUP BY d.DepName
  

Комментарии:

1. Предполагается, что название отдела уникально. DepartID кажется, лучше group by

Ответ №4:

Нет необходимости в вложенном запросе.

 SELECT dep.DepName, COUNT(emp.Name)
FROM DepName dep
    LEFT OUTER JOIN Employees emp ON dep.DepartID = emp.DepartID
GROUP BY dep.DepName
  

Комментарии:

1. Предполагается, что название отдела уникально. DepartID кажется, лучше group by

Ответ №5:

 SELECT COUNT(DISTINCT Name) FROM  
 Department AS d, Employees AS e   
WHERE d.DepartID=e.DepartID AND d.DepName = '$thename'
  

Ответ №6:

И чтобы избежать использования group by и сэкономить вам операцию сортировки в queryplan:

 SELECT 
    Department.DepName, 
    (SELECT COUNT(*)
    FROM Employees 
    WHERE Employees.DepartID = Department.DepartID)
FROM 
    Department