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 BY
expression booléenne directement. La séquence estFALSE
(0),TRUE
(1),NULL
(NUL). Si a est NULL, cette expression estFALSE
et trie en premier :(a IS NOT NULL)
. Le reste est classé parid
. Voilà. -
Sélection de
ID
se 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.