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 заявка с множество колони „име на ред“