Einfacher, kürzer, schneller mit DISTINCT ON
von PostgreSQL :
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, Erläuterungen, Benchmarks und Links in dieser eng verwandten Antwort
.
Ich verwende einen LEFT JOIN
, sodass Zeilen aus table_a
ohne übereinstimmende Zeile in table_b
werden nicht gelöscht.
Randbemerkungen:
Obwohl es in PostgreSQL erlaubt ist, ist es unklug, date
zu verwenden als Spaltenname. Es ist ein reserviertes Wort
in jedem SQL-Standard und ein Typname in PsotgreSQL.
Es ist auch ein Anti-Muster, eine ID-Spalte id
zu benennen . Nicht beschreibend und nicht hilfreich. Eine (von vielen) möglichen Namenskonventionen wäre, sie nach der Tabelle zu benennen, in der sie der Primärschlüssel ist:table_a_id
. Gleicher Name für darauf verweisende Fremdschlüssel (wenn kein anderer natürlicher Name Vorrang hat).