Cela peut être radicalement plus simple :
SELECT DISTINCT ON (b, c, e, f)
b, c, e, f, id -- add more columns freely
FROM (<duplicate query here>) sub
ORDER BY b, c, e, f, (a IS NOT NULL), id
-
Votre requête en double contient toutes les colonnes. Pas besoin de
JOINà la table de base. -
Utilisez l'extension Postgres du standard SQL
DISTINCT:DISTINCT ON: -
Postgres a un type booléen approprié. Vous pouvez
ORDER BYexpression booléenne directement. La séquence estFALSE(0),TRUE(1),NULL(NUL). Si a est NULL, cette expression estFALSEet trie en premier :(a IS NOT NULL). Le reste est classé parid. Voilà. -
Sélection de
IDse produit automatiquement. Selon votre description, vous voulez l'ID de la ligne sélectionnée dans cette requête. Plus rien à faire. -
Vous pouvez probablement l'intégrer directement dans votre requête en double.