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
JOINerforderlich 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 BYboolescher Ausdruck direkt. Die Sequenz istFALSE(0),TRUE(1),NULL(NULL). Wenn a NULL ist, ist dieser AusdruckFALSEund sortiert zuerst:(a IS NOT NULL). Der Rest ist nachidgeordnet . Voilá. -
Auswahl von
IDgeschieht 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.