Това може да бъде радикално по-просто :
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
-
Вашата дублирана заявка има всички колони. Няма нужда да
JOIN
отново към основната таблица. -
Използвайте Postgres разширението на стандартния SQL
DISTINCT
:DISTINCT ON
: -
Postgres има правилен булев тип. Можете да
ORDER BY
булев израз директно. Последователността еFALSE
(0),TRUE
(1),NULL
(НУЛА). Ако a е NULL, този израз еFALSE
и първо сортира:(a IS NOT NULL)
. Останалите са подредени поid
. Ето. -
Избор на
ID
става автоматично. Според вашето описание искате ID на реда, избран в тази заявка. Няма какво повече да правя. -
Вероятно можете да интегрирате това директно във вашата дублирана заявка.