PostgreSQL :: DISTINCT ON, VIEW

2 отговора 393 прегледа
#1

PostgreSQL :: DISTINCT ON, VIEW

Както е написано в документацията на PostgreSQL за DISTINCT:

"The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group."

Въпреки че това ми дава неограничена свобода в начина, по който искам да стане орязването, все пак ме ограничава от гледна точка на крайното подреждане. Както е в моя случай, искам да направи орязването, подреждайки по първа и втора колона, но да покаже крайния резултат подреден по трета или N-та колона. Единственото до което успях да стигна е да създавам VIEW с DISTINCT стойностите, всеки път, когато искам да подреждам по други колони и след това да си работя с VIEW-то...което ми се вижда леко неефикасно. Няма ли някакъв друг начин?

И всъщност, как точно е осъществено VIEW-то на ниско ниво? Всеки път се създава временна таблица или има и някакви оптимизатори за кеширане и т.н.?

Everything louder than everything else...

Редактирано от Dakota на

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

Re: PostgreSQL :: DISTINCT ON, VIEW

може да го направиш или с VIEW както си се сетил, или с под заявка

SELECT * FROM (твоята заявка, която избира всичко) ORDER BY квото_трябва

VIEW-то работи просто като предварително е анализирана заявката и е направен query plan, и при сложни заявки би било маааалко по-бързо, защото query plan-а ще е избран предварително, но това не винаги е така, защото при добавяне на условия, ако е реализирано без view, в някои случаи може да се открие по-добър query plan (общо взето VIEW-то е за улеснение на програмиста и рядко води до съществени скоростни изменения, но ако доведе, те може да са и в двете посоки)

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

Re: PostgreSQL :: DISTINCT ON, VIEW

Дааа...наистина за подзаявките не се бях сетил. Иначе това с предварителния query plan е също интересно - не е да ми звучи като нещо особено ключово, но за сложни заявки, както казваш, може би би било.

Благодаря.

Everything louder than everything else...
Отговор