Eenvoudiger, korter, sneller met PostgreSQL's DISTINCT ON
:
SELECT DISTINCT ON (a.id)
a.id, a.name, a.date, b.code1, b.code2
FROM table_a a
LEFT JOIN table_b b USING (id)
ORDER BY a.id, b.sort
Details, uitleg, benchmark en links in dit nauw verwante antwoord
.
Ik gebruik een LEFT JOIN
, zodat rijen van table_a
zonder enige overeenkomende rij in table_b
worden niet verwijderd.
Kanttekeningen:
Hoewel het is toegestaan in PostgreSQL, is het onverstandig om date
te gebruiken als kolomnaam. Het is een gereserveerd woord
in elke SQL-standaard en een typenaam in PsotgreSQL.
Het is ook een anti-patroon om een ID-kolom een naam te geven id
. Niet beschrijvend en niet nuttig. Een (van de vele) mogelijke naamgevingsconventies zou zijn om het te noemen naar de tabel waar het de primaire sleutel is:table_a_id
. Dezelfde naam voor externe sleutels die ernaar verwijzen (als geen andere natuurlijke naam voorrang heeft).