extra1, extra2, ...
sono "colonne extra" nella terminologia dei campi incrociati.
Il manuale per il modulo tablefunc
spiega le regole:
E più in basso:
Enfasi audace sulle parti chiave da parte mia.
Ordina solo per row_name
:
ORDER BY row_name ASC
Non importa nel primo esempio in cui filtri con:
WHERE ... t.extra1 = 'val1' -- single quotes by me
Tutte le righe di input hanno extra1 = 'val1'
comunque. Ma è importante nel secondo esempio in cui filtri con:
WHERE ... t.extra1 IN('val1', ...) --> More values
Ora, il primo requisito in grassetto sopra è violato per la colonna extra extra1
. Sebbene l'ordinamento della prima query di input non sia deterministico, i valori risultanti per la colonna "extra" extra1
vengono scelti arbitrariamente. Più valori possibili per extra1
, meno righe finiranno per avere 'val1':questo è quello che hai osservato.
Puoi ancora farlo funzionare:per segnalare extra1 = 'val1'
per ogni row_name
che ne ha almeno uno, cambia il ORDER BY
a:
ORDER BY row_name, (extra1 <> 'val1')
Ordina "val1" in alto. Spiegazione per quel boolean
espressione (con collegamenti ad altri):
Altre colonne "extra" vengono comunque scelte arbitrariamente mentre l'ordinamento non è deterministico.
Nozioni di base sui campi incrociati: