PostgreSQL :: GROUP BY
6 отговора
433 прегледа
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."
Струва ми се, че това изречение е напълно погрешно. Това че групирам по едно поле в дадена таблица автоматично означава, че групирам по целия ред в таблицата. Например, за следната заявка:
получавам следната грешка - "column "g.name" must appear in the GROUP BY clause or be used in an aggregate function". Ако махна g.name от SELECT-а, заявката минава. Каква е разликата? Би трябвало групирайки по едно поле в таблицата да групирам по целия ред - поне в MySQL е така.
Ако заявката използва вложени SELECT-и, всичко е наред:
Сигурно ще бъда обвинен в "MySQL-ски подход", но не виждам защо сървърът ме принуждава да използвам вложени SELECT-и, когато не мисля, че това е необходимо!?
Everything louder than everything else...
"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...
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, като гледам грешката на постгрето е същата. Разбира се, като нищо може и да бъркам, да не съм го разбрал, или пък да не го обяснявам както трябва :)
coef | name
3 | Gosho
4 | Pesho
4 | Tosho
4 | vanio
и цъкнеш
SELECT coef, name from tbl group by coef
заявката ще ти върне два реда (в mysql), обаче как да прецени дали да върне пешо, тошо или ваньо? На общо основание?
Така поне е в mssql, като гледам грешката на постгрето е същата. Разбира се, като нищо може и да бъркам, да не съм го разбрал, или пък да не го обяснявам както трябва :)
Re: PostgreSQL :: GROUP BY
PostgreSQL се държи коректно според мен. Аз съм работил с Oracle, MSSQL, Interbase и Firebird (на MySQL не съм) и всички се държат така. Държанието на MySQL е леко неопределено и може да доведе до объркване - това е мое мнение.
Честно казано не знам как е в стандарта, ще е интересно ако някой може да го цитира точно в този случай.
Боже колко мъка има на този свят Боже!



Честно казано не знам как е в стандарта, ще е интересно ако някой може да го цитира точно в този случай.
Боже колко мъка има на този свят Боже!
Re: PostgreSQL :: GROUP BY
Опитай да сложиш g.name като втори параметър на GROUP BY.
Би трябвало да тръгне, и аз преди се чудех защо иска и това да е там но ... спрях да се чудя
Би трябвало да тръгне, и аз преди се чудех защо иска и това да е там но ... спрях да се чудя
Re: PostgreSQL :: GROUP BY
В случая пропуснах да отбележа, че g.user_group_sid (при теб coef) ми е primary key и съответно unique, т.е. всеки ред е напълно дефиниран чрез това поле. Предполагам, че в MySQL има някакъв оптимизатор или пък предвид на това, че "SELECT DISTINCT" е същото като GROUP BY, последната е малко по user-friendly, т.е. позволява леко некоректни заявки. 
Everything louder than everything else...
Everything louder than everything else...
Re: PostgreSQL :: GROUP BY
Да, така си е идеално...само дето, както вече написах, групирам по unique поле, което незнайно защо очаквам и да се прихване от pgsql...явно грешката е моя. 
Everything louder than everything else...
Everything louder than everything else...
Re: PostgreSQL :: GROUP BY
стандарта е такъв! това се води като extension на mysql да позволява такова поведение, за улеснения от такъв вид
dunamis ти е казал правилният начин
dunamis ти е казал правилният начин