Điều này có thể đơn giản hơn hoàn toàn :
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
-
Truy vấn trùng lặp của bạn có tất cả các cột. Không cần
JOIN
vào bảng cơ sở một lần nữa. -
Sử dụng phần mở rộng Postgres của
DISTINCT
SQL chuẩn :DISTINCT ON
: -
Postgres có kiểu boolean thích hợp. Bạn có thể
ORDER BY
biểu thức boolean trực tiếp. Trình tự làFALSE
(0),TRUE
(1),NULL
(VÔ GIÁ TRỊ). Nếu a là NULL, biểu thức này làFALSE
và sắp xếp trước:(a IS NOT NULL)
. Phần còn lại được sắp xếp theoid
. Voilá. -
Lựa chọn
ID
xảy ra tự động. Theo mô tả của bạn, bạn muốn ID của hàng được chọn trong truy vấn này. Không cần làm gì nữa. -
Bạn có thể tích hợp trực tiếp điều này vào truy vấn trùng lặp của mình.