PostgreSQL :: GROUP BY

6 отговора 433 прегледа
#1

PostgreSQL :: GROUP BY

В документацията на PostgreSQL за GROUP BY е написано, че:

"When GROUP BY is present, it is not valid for the SELECT list expressions to refer to ungrouped columns except within aggregate functions, since there would be more than one possible value to return for an ungrouped column."

Струва ми се, че това изречение е напълно погрешно. Това че групирам по едно поле в дадена таблица автоматично означава, че групирам по целия ред в таблицата. Например, за следната заявка:

SELECT

g.user_group_sid,
g.name,
COUNT(u.user_sid) as length
FROM
user_group g LEFT JOIN user_user_group u
ON
g.user_group_sid=u.user_group_sid
GROUP BY
g.user_group_sid


получавам следната грешка - "column "g.name" must appear in the GROUP BY clause or be used in an aggregate function". Ако махна g.name от SELECT-а, заявката минава. Каква е разликата? Би трябвало групирайки по едно поле в таблицата да групирам по целия ред - поне в MySQL е така.

Ако заявката използва вложени SELECT-и, всичко е наред:

SELECT

g.user_group_sid,
g.name,
(SELECT COUNT(*) FROM user_user_group u WHERE u.user_group_sid=g.user_group_sid) as length
FROM
user_group g


Сигурно ще бъда обвинен в "MySQL-ски подход", но не виждам защо сървърът ме принуждава да използвам вложени SELECT-и, когато не мисля, че това е необходимо!?

Everything louder than everything else...
Отговор
в отговор на Dakota #2

Re: PostgreSQL :: GROUP BY

Ами... идеята (аз също малко се стъписах, когато преминах от mysql на mssql) е, че щом изискващ редове и имаш групиране, трябва да укажеш всяко едно поле, което връщаш, в group by заявката, в противен случай базата сама трябва да прецени коя стойност от възможните (ако е групирала 5 реда - коя стойност?) да ти върне от непосочените в group by полета - което сега ми се струва правилно. Или иначе казано - ако имаш

coef | name
3 | Gosho
4 | Pesho
4 | Tosho
4 | vanio

и цъкнеш

SELECT coef, name from tbl group by coef

заявката ще ти върне два реда (в mysql), обаче как да прецени дали да върне пешо, тошо или ваньо? На общо основание?

Така поне е в mssql, като гледам грешката на постгрето е същата. Разбира се, като нищо може и да бъркам, да не съм го разбрал, или пък да не го обяснявам както трябва :)

Отговор
в отговор на Dakota #3

Re: PostgreSQL :: GROUP BY

PostgreSQL се държи коректно според мен. Аз съм работил с Oracle, MSSQL, Interbase и Firebird (на MySQL не съм) и всички се държат така. Държанието на MySQL е леко неопределено и може да доведе до объркване - това е мое мнение.
Честно казано не знам как е в стандарта, ще е интересно ако някой може да го цитира точно в този случай.

Боже колко мъка има на този свят Боже!
Отговор
в отговор на Dakota #4

Re: PostgreSQL :: GROUP BY

Опитай да сложиш g.name като втори параметър на GROUP BY.
Би трябвало да тръгне, и аз преди се чудех защо иска и това да е там но ... спрях да се чудя

Отговор
в отговор на я #5

Re: PostgreSQL :: GROUP BY

В случая пропуснах да отбележа, че g.user_group_sid (при теб coef) ми е primary key и съответно unique, т.е. всеки ред е напълно дефиниран чрез това поле. Предполагам, че в MySQL има някакъв оптимизатор или пък предвид на това, че "SELECT DISTINCT" е същото като GROUP BY, последната е малко по user-friendly, т.е. позволява леко некоректни заявки.

Everything louder than everything else...
Отговор
в отговор на dunamis #6

Re: PostgreSQL :: GROUP BY

Да, така си е идеално...само дето, както вече написах, групирам по unique поле, което незнайно защо очаквам и да се прихване от pgsql...явно грешката е моя.

Everything louder than everything else...
Отговор
в отговор на Dakota #7

Re: PostgreSQL :: GROUP BY

стандарта е такъв! това се води като extension на mysql да позволява такова поведение, за улеснения от такъв вид

dunamis ти е казал правилният начин

Отговор