Dies kann radikal einfacher sein :
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
-
Ihre doppelte Abfrage enthält alle Spalten. Es ist kein
JOIN
erforderlich zurück zur Basistabelle. -
Verwenden Sie die Postgres-Erweiterung des Standard-SQL
DISTINCT
:DISTINCT ON
: -
Postgres hat einen richtigen booleschen Typ. Sie können
ORDER BY
boolescher Ausdruck direkt. Die Sequenz istFALSE
(0),TRUE
(1),NULL
(NULL). Wenn a NULL ist, ist dieser AusdruckFALSE
und sortiert zuerst:(a IS NOT NULL)
. Der Rest ist nachid
geordnet . Voilá. -
Auswahl von
ID
geschieht automatisch. Gemäß Ihrer Beschreibung möchten Sie die ID der in dieser Abfrage ausgewählten Zeile. Nichts mehr zu tun. -
Sie können dies wahrscheinlich direkt in Ihre doppelte Abfrage integrieren.