Je suis en cours d'exécution d'une requête comme ceci:Comment un SELECT avec un terme ET supplémentaire peut-il produire plus de lignes que sans lui?
Dans la première varianteSELECT distinct me.*
FROM me
LEFT JOIN has_things ON has_things.me_id = me.id
LEFT JOIN has_refs ON has_refs.thing_id = has_things.thing_id
WHERE
has_refs.ref_id = 456
AND me.id=123;
, j'omettent la dernière ligne AND me.id = 123
et obtenir 0 lignes tandis que dans la deuxième variante j'inclure cette ligne et obtenir 1 rang.
Dans une autre variante où la dernière ligne est AND me.id >= 123
, j'obtiens 0 lignes.
J'utilise psql
pour interroger la base de données. Qu'est-ce qui me manque, et comment puis-je résoudre ce problème? Je pensais que AND
conditions peuvent seulement réduire le nombre de correspondances.
Est-ce que quelqu'un connaît de tels bogues PostgreSQL où les lignes disparaissent ou disparaissent, peut-être avec des liens vers des tickets de bogues ou autre chose?
semble lié à mon autre question:
How can PDO not return a row which pg_query() does?
Quel type de données est 'me.id'? Pouvez-vous fournir une configuration de test complète pour reproduire cela? Le plan d'exécution affiche-t-il une recherche d'index pour cette colonne? Si oui, recréer l'index aide-t-il? –
C'est probablement en combinaison avec ce que vous avez dans votre LEFT JOIN et les autres parties de WHERE –
'me.id' est de type' serial NOT NULL'. Nous allons essayer de recréer l'index pendant les heures de nuit où la charge est faible. J'ai mis à jour ma requête avec la vraie, que j'ai réussi à minimiser tout en produisant toujours les mêmes résultats. Pour moi, les «JOIN» semblent entièrement sans méfiance. – Archimedix