2017-02-03 4 views
0

У меня следующее соотношение:SQL QUERY, что не может появиться в условии наличия?

R(A, B, C, D, E) 

и следующий запрос

SELECT ... 
    FROM R 
    WHERE ... 
    GROUP BY B, E 
    HAVING ??? 

То, что не может появиться в статье, имеющей ?: MAX (С), COUNT (А), D, В

Я считаю, что все они работают, но я немного сомневаюсь в B. MAX (C) работает, потому что мы можем связать максимальное значение столбца c в группе. То же самое для COUNT (A). D также работает. Это просто атрибут, но странно привязывать член предложения GROUP BY.

+0

D не должен работать. Поскольку вы используете 'GROUP BY B, E', поэтому в HAVING все остальные столбцы, отличные от B, E, должны появляться с агрегатными функциями, поэтому MAX (c) и COUNT (a) должны работать, а D не должны. D будет вызывать ошибку, как «не группа по выражению» –

+0

. Посмотрите, что D = возраст, и вы просто хотите, чтобы возраст был меньше 30. Как вы ограничиваете это в каждой группе. Я думал, что предложение HAVING - это то же самое, что и предложение WHERE. – TheMathNoob

+1

ИМЕЕТСЯ только с GROUP BY, и это означает, что where_aggregate_functions_of_group_by, чтобы вы могли использовать «МАЛЬЧИК» (возраст) <30'. В разделе WHERE вы не можете использовать 'WHERE MAX (age) <30'. –

ответ

0

В соответствии со стандартом SQL, при объединении записей (что вы делаете с GROUP BY), вы можете выбрать

  • поля, которые группа по. (Конечно, если я группирую сотрудник и отдел, т. Е. Хочу получить строку результатов для каждого сотрудника и отдела, я могу показать их в результате.)
  • скопления, такие как суммы, счета и т. Д. (Если я группирую отдела, я могу подсчитать сотрудников или подытожить их зарплату и показать их в результате.)
  • поля, функционально зависимые от сгруппированных по столбцам. (Если группа I по уникальному номеру сотрудника, я могу также показать Employés имя экземпляра.)

Многие СУБД не поддерживают последний случай, однако (и заставить вас избыточно поставить имя сотрудника в GROUP BY или неуклюже псевдоагрегировать, например, MIN(name), хотя, конечно, существует только одно имя для каждого сотрудника).

Что может появиться в статье HAVING? Все столбцы и выражения, которые вы можете выбрать.

  1. MAX(C). Да, вы найдете максимум C за B и E.
  2. COUNT(A). Да. Вы считаете все записи за B и E, где A не имеет значения.
  3. D. Только если D зависит от B и E. СУБД увидит это с уникальными ограничениями на таблицу, то есть, если B или E или B + E уникально для таблицы, вы можете выбрать D. (При условии, что СУБД является стандартным здесь.)
  4. B. Да. Это B, с которым вы группируетесь. Конечно, вы можете показать его или использовать его в HAVING.