Umgehen von Unter-Select-Abfragen in Join

Hi,

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?

Danke für eure Mühe!

Crypi

evtl. so ?

SELECT a.name, max(b.datum) FROM Anlage AS a
LEFT JOIN Ereignis AS b
ON a.laufendenummer = b.laufendenummer_anlage
group by a.name

Ich werde das mal testen!
Danke für die Antwort!

Crypi

Hi,

das funktioniert soweit gut.
Nur wie bekomme ich es hin, dass ich weiter Felder selektieren kann?

Die müssen dann ja im group by erscheinen.
Bloß damit verändere ich dann ja das Ergebnis.

Ich wollte jetzt noch ein Feld aus der Tabelle mit dem zu maximierenden Datum selektieren.

Gruß,
Crypi

Du hast also bisher dies:

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)

Oder?

Andreas

Faszinierend welche Möglichkeiten es gibt!

Ich werde das gleich testen!

Danke!



Crypi

Geht noch schöner:

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)

Andreas