Сгруппировать и иметь проблемы с пониманием - PullRequest
0 голосов
/ 06 января 2019

Я смотрел на какой-то SQL-запрос, который у меня есть в базе данных Access, который я не делал.

Один из SQL-запросов выглядит примерно так:

select column1 from table1 group by column1 having count(*)>1

Цель этого запроса - найти значение в column1, которое появляется более одного раза. Я могу убедиться, что этот запрос работает правильно и возвращает значение столбца, которое появляется более одного раза.

Однако я не понимаю, почему этот запрос работает. Насколько я понимаю, использование group by удалит дубликаты полей. Например, если столбец1 имел

    column1
    apple
    mango
    mango

Выполнение group by (column1) приведет к

    column1
    apple
    mango

В этот момент, если мы выполним having count(*)>1 или having count(column1)>1, он не должен возвращать никакого результата, так как group by уже удалил дублирующее поле. Но ясно, что я не прав, поскольку приведенный выше оператор SQL дает точный результат.

Не могли бы вы сообщить мне проблему в моем понимании?

Редактировать 1:

Помимо принятого ответа, я эта статья, которая касается порядка работы с SQL, действительно помогла мне понять

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Предложение GROUP BY группирует выборку по полям, которые вы упомянули, в этом случае column1, но может быть комбинированным столбцом (например, column1, column2). Кстати, я думаю, что если вы запустите:

SELECT column1, Count(*) AS [Count], MIN(column2) AS MinColumn2, MAX(column2) AS MaxColumn2
FROM table1 
GROUP BY column1;

Поможет вам понять, как работает GROUPING. При фильтрации по любому столбцу напрямую вы можете использовать условие WHERE, но если вы хотите фильтровать по любому полю, рассчитанному по группировке, вам нужно использовать условие HAVING.

0 голосов
/ 06 января 2019

Вы неправильно понимаете, как работает HAVING. На самом деле, вы можете думать об этом, используя подзапросы. Ваш запрос эквивалентен:

select column1
from (select column1, count(*) as cnt
      from table1
      group by column1
     ) as t
having cnt > 1;

То есть having фильтрует запрос агрегации после агрегации. Однако функции агрегирования применяются на группу . Так что count(*) считает количество строк в каждой группе. Вот почему он идентифицирует дубликаты.

0 голосов
/ 06 января 2019

group by не просто удаляет повторяющиеся значения - он возвращает одну строку для каждого отдельного значения группы по выражению и позволяет применять статистическую функцию для такого уникального значения.

В этом запросе вы фактически запрашиваете значения column1 и результат count(*) для значения столбца1 , затем вы используете предложение having, чтобы возвращать только значения column1, у которых count(*) больше 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...