Причина создания этого антипаттерна проста: он показывает распространенное заблуждение многих программистов о том, как работает группировка в SQL.
Правило единственного значения
Строки в каждой группе — это те строки, которые имеют одинаковые значения в столбце или столбцах, указанные после предложения GROUP BY. Например, в указанном ниже запросе для группы назначена одна строка для каждого различного значения в столбце product_id.
Файл примера: Groups/anti/groupbyproduct.sql
SELECT product_id, MAX(date_reported) AS latest FROM Bugs JOIN BugsProducts USING (bug_id) GROUP BY product_id;
Каждый столбец в списке выборки запроса должен иметь одно-единственное значение для всех строк в группе. Таково Правило единственного значения. Столбцы, перечисленные в операторе GROUP BY, гарантированно будут иметь строго одно значение в группе, вне зависимости от того, сколько строк данная группа включает.
Выражение МАХ() также гарантирует вывод единственного значения для каждой группы: в данном случае наибольшего значения среди всех строк в группе.
Однако когда речь идет о сервере базы данных в целом, нельзя быть абсолютно уверенными в отношении всех остальных столбцов, перечисленных в списке выборки. Нельзя дать гарантию, что одинаковые значения принадлежат каждой строке в других столбцах.
Опубликовал vovan666
August 16 2013 07:29:10 ·
0 Комментариев ·
4060 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.