Разлика между GROUP BY HAVING и SELECT MAX() GROUP BY

Нов съм в SQL и се обърквам от разликата в следните две заявки:

SELECT MAX(версия), * FROM таблица WHERE primary_key = @key GROUP BY местоположение

ИЗБЕРЕТЕ версия, * ОТ таблица WHERE primary_key = @key GROUP BY location HAVING version = MAX(version)

Ако приемем, че таблицата изглежда така:

primary_key | version | location | data

Ако разбирам това правилно, и двете заявки избират максималния запис на версия във всяко местоположение (сред тези, които имат @key като първичен ключ). И така, има ли разлика между двете заявки? Или разликата е само в производителността?


person tpoker    schedule 27.06.2017    source източник
comment
comment
Нищо. И двете генерират една и съща синтактична грешка.   -  person Strawberry    schedule 27.06.2017
comment
@mohan111 Статията не е много добра, използва различни логически подходи, за да очертае разликата между притежаване и групиране по... Така че резултатът очевидно е различен. (С group by той просто разглежда copies_in_stock, с having препраща към max (псевдоним на MAX(copies_in_stock)).. Ако той използва FROM writer WHERE MAX(copies_in_stock) > 5 GROUP BY poet;вместо това, той ще получи същия резултат, както ако се използва having-клауза върху псевдонима на агрегацията върху copies_in_stock.   -  person dognose    schedule 27.06.2017


Отговори (2)


Пропуснахте името на таблицата
използването на * звезда (всички колони), когато използвате функцията за агрегиране, е отхвърлено и в повечето db не е разрешено

SELECT MAX(version) 
FROM your_table  
WHERE primary_key = @key 
GROUP BY location

SELECT version
FROM your_table
WHERE primary_key = @key 
GROUP BY location 
HAVING version = MAX(version)

двете qyery са различни, защото във втората получената заявка е филтър за съответствие с условието за наличие

да работите някога върху резултата от заявка (вместо да работите директно върху източника на ред за заявката) и да, вторият е по-бавен от първия ... в повечето случаи разликата може да не е осезаема

person scaisEdge    schedule 27.06.2017
comment
Благодаря, че изразихте мнението си за * . С помощта на * се опитвах да се фокусирам върху останалите колони, избрани в двете заявки: Ако изберем повече от една колона в горния пример (напр. версия, данни), гарантирано ли е, че избраните „данни“ са в същия ред, където се случва максималната транзакционна_версия? - person tpoker; 27.06.2017
comment
Искате да кажете, че ако дадена колона не е в група от е в списъка за избор ... Тогава в този случай не е гарантирано, че получените стойности са същите като на реда, където имате обобщения резултат .. (обикновено се показва първият срещнат от извличането на заявката) и поради тази причина използването на * или използването на колона, която не е в group by, е отхвърлено и в повечето db не е разрешено ... надявам се, че съм ясен .. - person scaisEdge; 27.06.2017
comment
Да, ти беше! Благодаря за пояснението. - person tpoker; 27.06.2017

Моля, вижте връзката по-долу, може да е полезна: http://www.dofactory.com/sql/group-by

person Kris Rudra    schedule 27.06.2017