ich habe eine normale 1-n-Beziehung zwischen zwei Tabellen:
Anlage
laufendenummer | name
Ereignis
laufendenummer_anlage | datum | beschreibung
Das Feld “Datum” der Tabelle “Ereignis” ist vom Typ timestamp.
Ich suche jetzt nach einer Möglichkeit alle Anlagen mit dem Datum des jüngsten Ereignisses, wenn Ereignisse vorhanden sind (sonst ohne Datum),
anzuzeigen.
SELECT a.name, b.datum FROM Anlage AS a
LEFT JOIN Ereignis AS b
ON a.laufendenummer = b.laufendenummer_anlage
WHERE b.datum = (SELECT MAX(datum) FROM Ereignis WHERE laufendenummer_anlage = a.laufendenummer)
Ich würde das gerne ohne die Unter-Select-Abfrage realisieren.
Gibt es da einen Weg?
test=*# select * from tab1;
i | n
---+-------
1 | name1
2 | name2
(2 rows)
test=*# select * from tab2;
i | d | t
---+------------+---------
1 | 2009-06-15 | heute
1 | 2009-06-14 | gestern
1 | 2009-06-16 | morgen
(3 rows)
test=*# select a.n, max(b.d) from tab1 a left join tab2 b on (a.i=b.i) group by a.n;
n | max
-------+------------
name2 |
name1 | 2009-06-16
(2 rows)
und willst
test=*# select foo.*, tab2.t from (select a.n, max(b.d) from tab1 a left join tab2 b on (a.i=b.i) group by a.n) foo left join tab2 on (foo.max=tab2.d);
n | max | t
-------+------------+--------
name2 | |
name1 | 2009-06-16 | morgen
(2 rows)
test=*# select distinct on (a.n) a.n, b.d, b.t from tab1 a left join tab2 b on a.i=b.i order by a.n, b.d asc;
n | d | t
-------+------------+---------
name1 | 2009-06-14 | gestern
name2 | |
(2 rows)
test=*# select distinct on (a.n) a.n, b.d, b.t from tab1 a left join tab2 b on a.i=b.i order by a.n, b.d desc;
n | d | t
-------+------------+--------
name1 | 2009-06-16 | morgen
name2 | |
(2 rows)