SQL - MIN () против ГДЕ - PullRequest
       33

SQL - MIN () против ГДЕ

0 голосов
/ 18 октября 2018

Являются ли эти запросы совершенно одинаковыми или возможно получить разные результаты в зависимости от данных?

SELECT A, B, C, D 
FROM Table_A 
GROUP BY A, B, C, D , E
HAVING A in (1,2) AND E = 1 AND MIN(status) = 100

SELECT A, B, C, D 
FROM Table_A 
WHERE A IN (1,2) AND E = 1 AND status = 100
GROUP BY A, B, C, D , E

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

На высоком уровне:

  • Предложение where задает условия поиска для строк, возвращаемых Запросом, и ограничивает строки значимым набором.

  • , имеющий условие , работает как фильтр поверх сгруппированных строк.

0 голосов
/ 18 октября 2018

Они не равны.

При рассмотрении следующего блока

create table Table_A(A int, B int, C int, D int, E int, status int);
insert into Table_A values(1,1,1,1,1,100);
insert into Table_A values(1,1,1,1,1,10);
insert into Table_A values(2,1,1,1,1,10);

SELECT A, B, C, D, 'First Query' as query 
FROM Table_A 
GROUP BY A, B, C, D , E
HAVING A in (1,2) AND E = 1 AND MIN(status) = 100;

SELECT A, B, C, D, 'Second Query' as query   
FROM Table_A 
WHERE A IN (1,2) AND E = 1 AND status = 100
GROUP BY A, B, C, D , E

в результате вы получите

A   B   C   D   query
-   -   -   -   -------------
1   1   1   1   Second Query

(возвращается только второй)),

, поскольку для обеих групп 1,1,1,1,1 и 2,1,1,1,1 -> min(status)=10.

По этой причине min(status)=100 случай никогда не возникает, и первый запрос не возвращает результата.

Демонстрация Rextester

0 голосов
/ 18 октября 2018

Пара вещей:

HAVING MIN(status) = 100

и

WHERE status = 100

различны.Условие where отфильтровывает все, что не является 100, точка - это даже не оценивается.Предложение has оценивает его только после того, как прочитана каждая запись, и просматривает результат агрегатной функции (min) для указанной группировки.

Кроме того, более тонкое различие заключается в том, что предложение where длянеагрегированные функции предпочтительнее, поскольку они могут использовать любой индекс в таблице, и, что не менее важно, они будут препятствовать группированию и объединению записей.

Например,

having E = 1

и

where E = 1

функционально делают то же самое.Разница в том, что вам нужно собирать, группировать и сортировать кучу записей только для того, чтобы отбросить их, используя «наличие», тогда как опция «где» удаляет их до того, как произойдет какая-либо группировка.Кроме того, в этом примере с опцией «где» вы можете удалить E из критерия группировки, поскольку оно всегда равно 1.

...