sql >> Databasteknik >  >> RDS >> PostgreSQL

Oväntad effekt av filtrering på resultat från crosstab()-fråga

extra1, extra2, ... är "extra kolumner" i korstabellsterminologi.
Manualen för tablefunc-modulen förklarar reglerna:

Och längre ner:

Djärv betoning på nyckeldelarna av mig.

Du sorterar bara efter row_name :

ORDER  BY row_name ASC

Spelar ingen roll i det första exemplet där du filtrerar med:

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

Alla inmatningsrader har extra1 = 'val1' i alla fall. Men det spelar roll i det andra exemplet där du filtrerar med:

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

Nu överträds det första kravet i fetstil ovan för den extra kolumnen extra1 . Medan sorteringsordningen för den första inmatningsfrågan är icke-deterministisk, resulterar värden för "extra" kolumnen extra1 väljs godtyckligt. De fler möjliga värdena för extra1 , desto färre rader kommer att ha 'val1':det är vad du observerade.

Du kan fortfarande få det att fungera:att rapportera extra1 = 'val1' för varje row_name som har minst en av dessa, ändra ORDER BY till:

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

Sorterar "val1" överst. Förklaring till den boolean uttryck (med länkar till fler):

Andra "extra" kolumner väljs fortfarande godtyckligt medan sorteringsordningen inte är deterministisk.

Grundläggande om korstabell:




  1. installera både mysql och mysqlnd på ubuntu 12.04

  2. Driving Performance för PostgreSQL med HAProxy

  3. hämta 3 rader varje dag om du planerar för 1 år

  4. Varför måste vi använda främmande nycklar?