extra1, extra2, ... sont des "colonnes supplémentaires" dans la terminologie du tableau croisé.
Le manuel du module tablefunc
explique les règles :
Et plus bas :
J'insiste audacieusement sur les éléments clés.
Vous ne triez que par row_name :
ORDER BY row_name ASC
Peu importe dans le premier exemple où vous filtrez avec :
WHERE ... t.extra1 = 'val1' -- single quotes by me
Toutes les lignes d'entrée ont extra1 = 'val1' De toute façon. Mais c'est important dans le deuxième exemple où vous filtrez avec :
WHERE ... t.extra1 IN('val1', ...) --> More values
Maintenant, la première exigence en gras ci-dessus n'est pas respectée pour la colonne supplémentaire extra1 . Bien que l'ordre de tri de la première requête d'entrée soit non déterministe, les valeurs résultantes pour la colonne "extra" extra1 sont choisis arbitrairement. Plus de valeurs possibles pour extra1 , moins de lignes finiront par avoir 'val1' :c'est ce que vous avez observé.
Vous pouvez toujours le faire fonctionner :pour signaler extra1 = 'val1' pour chaque row_name qui en a au moins un, changez le ORDER BY à :
ORDER BY row_name, (extra1 <> 'val1')
Trie 'val1' en premier. Explication pour ce boolean expression (avec des liens vers plus):
D'autres colonnes "supplémentaires" sont toujours choisies arbitrairement alors que l'ordre de tri n'est pas déterministe.
Principes de base du tableau croisé :