PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Неочакван ефект от филтрирането върху резултат от кръстосана заявка().

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 израз (с връзки към още):

Други „допълнителни“ колони все още се избират произволно, докато редът на сортиране не е детерминистичен.

Основи на кръстосаната таблица:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция за проследяване на зависимости

  2. Дизайн на база данни - nullable полета

  3. Промяна на sqlite към PostgreSQL в ruby ​​on rails

  4. Динамично наблюдение на екземпляри на PostgreSQL с помощта на pg_top

  5. connect_by_root еквивалент в postgres