При использовании ... HAVING COUNT (*) = (... MAX () ..) работает:
- В запросе требуется почти один и тот же подзапрос дважды.
- Для большинства баз данных требуется подзапрос 2-го уровня как MAX (COUNT (*))
не поддерживается.
При использовании TOP / LIMIT / RANK и т. Д. Работает:
- Используются расширения SQL для конкретной базы данных.
Кроме того, использование TOP / LIMIT = 1 даст только одну строку - что если два или более врачей имеют одинаковое максимальное количество пациентов?
Я бы разбил проблему на шаги:
Получить целевое поле (поля) и связанный с ним счет
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
Используя вышеупомянутое как «представление в виде оператора», присоединитесь, чтобы получить строки с максимальным количеством
WITH x AS
(
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
)
SELECT x.docName, x.countX
FROM x
INNER JOIN
(
SELECT MAX( countX ) AS maxCountX
FROM x
) x2
ON x2.maxCountX = x.countX
Предложение WITH, которое определяет «представление в области оператора», фактически дает именованные подзапросы, которые можно повторно использовать в том же запросе.
JOIN соответствует ряду (ам) максимального количества пациентов.
Хотя это решение, с использованием представлений в рамках оператора, длиннее, оно составляет:
- Проще проверить
- Самодокументирование
- Выдвижная
Это проще для тестирования, так как части запроса могут выполняться автономно.
Самодокументируется, так как запрос напрямую отражает требование
т. е. представление в области действия оператора перечисляет целевое поле (поля) и соответствующее количество.
Его можно расширять, как если бы требовались другие условия или поля, его можно легко добавить в представление области оператора.
например, в этом случае структура таблицы должна быть изменена, чтобы в качестве первичного ключевого поля был указан идентификатор доктора, и это должно быть частью результатов.