sql >> Database >  >> RDS >> PostgreSQL

Onverwacht effect van filteren op resultaat van kruistabel()-query

extra1, extra2, ... zijn "extra kolommen" in kruistabelterminologie.
De handleiding voor de tablefunc-module legt de regels uit:

En verder naar beneden:

Vetgedrukte nadruk op belangrijke onderdelen door mij.

U sorteert alleen op row_name :

ORDER  BY row_name ASC

Maakt niet uit in het eerste voorbeeld waar je filtert met:

WHERE ... t.extra1 = 'val1'  -- single quotes by me

Alle invoerrijen hebben extra1 = 'val1' hoe dan ook. Maar het is belangrijk in het tweede voorbeeld waar je filtert met:

WHERE ... t.extra1 IN('val1', ...) --> More values

Nu wordt de eerste vetgedrukte vereiste hierboven geschonden voor de extra kolom extra1 . Hoewel de sorteervolgorde van de eerste invoerquery niet-deterministisch is, resulteren de resulterende waarden voor de "extra" kolom extra1 worden willekeurig gekozen. Hoe meer mogelijke waarden voor extra1 , hoe minder rijen 'val1' krijgen:dat is wat je hebt waargenomen.

Je kunt het nog steeds laten werken:rapporteer extra1 = 'val1' voor elke row_name die er minstens één heeft, verander de ORDER BY naar:

ORDER  BY row_name, (extra1 <> 'val1')

Sorteert 'val1' bovenaan. Uitleg voor die boolean expressie (met links naar meer):

Andere "extra" kolommen worden nog steeds willekeurig gekozen terwijl de sorteervolgorde niet bepalend is.

Basisprincipes van kruistabellen:




  1. Hoe het versienummer te lezen uit een databasebestand in Android dat in de activamap is geplaatst

  2. Hoe de sortering van een kolom in SQL Server (T-SQL) in te stellen

  3. Kun je een index maken in de CREATE TABLE-definitie?

  4. Detecteer SQL-eiland over meerdere parameters en voorwaarden