Упражнение 28
В поддержку часто присылают такое решение от новичков:
SELECT COUNT(Maker) AS qnty
FROM Product
GROUP BY maker
HAVING COUNT(model)=1;
[[ column ]] |
---|
[[ value ]] |
Помимо того, что это неверное решение задачи, новичка выдают функции COUNT(maker)/COUNT(model). COUNT(maker) - это вовсе не число производителей, а число строк в группе, для которых maker не равен NULL. COUNT(model) оказалось равным числу моделей, но не потому, что использован аргумент model, а потому, что каждая строка в таблице представляет собой модель, а model является ключом и не может быть NULL. Поскольку maker, согласно схеме, тоже не может быть NULL, то имеем
COUNT(maker) = COUNT(model) = COUNT(*) = COUNT(1) = ...
И все это число моделей в группе, а именно число моделей производителя, т.к. группировка выполняется по имени производителя (maker).
Итак, вот что делает данный запрос.
- Записи в таблице Product группируются по maker с подсчетом количества строк (моделей) для каждого производителя.
- Выполняется фильтрация групп, ограничивающая эти количества значением 1.
В результате получим:
1 |
1 |
1 |
… |
И таких строк будет столько, сколько у нас имеется производителей, выпускающих по одной модели. Таким образом, рассматриваемый запрос отвечает следующему условию:
Согласитесь, что это совсем не то, что требовалось найти в упражнении 28. Хотя, чтобы решить задачу, осталось сделать совсем немногое, а именно, пересчитать эти строки. Это можно сделать, используя вышеприведенный запрос в качестве подзапроса (или CTE).
Если этой подсказки вам недостаточно для решения задачи, изучите следующий материал: