extra1, extra2, ...
са "допълнителни колони" в терминологията на кръстосаните таблици.
Ръководството за модула tablefunc
обяснява правилата:
И по-надолу:
Удебелен акцент върху ключови части от мен.
Сортирате само по row_name
:
ORDER BY row_name ASC
Няма значение в първия пример, когато филтрирате с:
WHERE ... t.extra1 = 'val1' -- single quotes by me
Всички входни редове имат extra1 = 'val1'
така или иначе. Но има значение във втория пример, когато филтрирате с:
WHERE ... t.extra1 IN('val1', ...) --> More values
Сега първото удебелено изискване по-горе е нарушено за допълнителната колона extra1
. Въпреки че редът на сортиране на първата входна заявка е недетерминиран, получените стойности за колоната „extra“ extra1
се избират произволно. Повече възможни стойности за extra1
, колкото по-малко редове ще имат 'val1':това е, което наблюдавахте.
Все още можете да го накарате да работи:да докладвате extra1 = 'val1'
за всяко row_name
който има поне едно от тях, променете ORDER BY
до:
ORDER BY row_name, (extra1 <> 'val1')
Сортира „val1“ отгоре. Обяснение за този boolean
израз (с връзки към още):
Други „допълнителни“ колони все още се избират произволно, докато редът на сортиране не е детерминистичен.
Основи на кръстосаната таблица:
- Кръстосана заявка на PostgreSQL
- Кръстосана таблица на Postgresql заявка с множество колони „име на ред“