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: