Join aber nur neusten eintrag anzeigen

Hi,

Folgende abfrage(leicht vereinfacht zwecks uebersich):

SELECT anlagen.tbl_anlage.id,
anlagen.tbl_anlage.standort,
anlagen.tbl_anlage.bezeichnung
anlagen.tbl_planungsversion.version,
anlagen.tbl_planungsversion.date
FROM anlagen.tbl_anlage
LEFT OUTER JOIN anlagen.tbl_anlagentyp
ON anlagen.tbl_anlage.anlagentyp_id =3D
anlagen.tbl_anlagentyp.id
LEFT OUTER JOIN anlagen.tbl_planungsversion
ON anlagen.tbl_anlage.id =3D
anlagen.tbl_planungsversion.anlage_id
WHERE (anlagen.tbl_anlage.id IN ( ....

Diese abfrage soll erreichen, das folgende tabelle erstellt werden kann:

Id | standort | bezeichnung |
version | versionsdate
------------------------------------------------------------ ----------------
----------
1 | da | diese anlage | 1.0.0
| 2006.03.12
2 | hier | jene anlage |
1.1.6 | 2006.04.01
.. |
.. |
.. |


PROBLEM:
Die tabelle anlagen.tbl_planungsversion enthaelt alle versionen der anlage
ueber den zeitraum x.
In der tabelle soll aber immer nur die LETZTE version(vom datum her)
angezeigt werden. Logischweise
Würde die abfrage wie oben funzen, wenn ich sie nach id, date sortiere und
immer nur die 1. zeile
Anzeige würde. Das ist antürlich nicht sinnvoll. Hat jemand fuer einen
ahnungslosen einen tip?
Achso distinct geht ja nicht, wegen 'order by
anlagen.tbl_planungsversion.date', was ich ja machen muss

thx


---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

http://archives.postgresql.org
rene hankel [ Mo, 10 April 2006 15:11 ] [ ID #1267737 ]

Re: Join aber nur neusten eintrag anzeigen

am 10.04.2006, um 15:11:27 +0200 mailte rene hankel folgendes:
> Hi,
>
> Folgende abfrage(leicht vereinfacht zwecks uebersich):
>
> SELECT anlagen.tbl_anlage.id,
> anlagen.tbl_anlage.standort,
> anlagen.tbl_anlage.bezeichnung
> anlagen.tbl_planungsversion.version,
> anlagen.tbl_planungsversion.date
> FROM anlagen.tbl_anlage
> LEFT OUTER JOIN anlagen.tbl_anlagentyp
> ON anlagen.tbl_anlage.anlagentyp_id =3D
> anlagen.tbl_anlagentyp.id
> LEFT OUTER JOIN anlagen.tbl_planungsversion
> ON anlagen.tbl_anlage.id =3D
> anlagen.tbl_planungsversion.anlage_id
> WHERE (anlagen.tbl_anlage.id IN ( ....
>
>
> PROBLEM:
> Die tabelle anlagen.tbl_planungsversion enthaelt alle versionen der anl=
age
> ueber den zeitraum x.
> In der tabelle soll aber immer nur die LETZTE version(vom datum her)
> angezeigt werden. Logischweise
> Würde die abfrage wie oben funzen, wenn ich sie nach id, date sortier=
e und
> immer nur die 1. zeile

Wäre eine weitere WHERE-Bedingung auf max(date) nicht das, was Du
suchst? Also:

WHERE (anlagen.tbl_anlage.id IN ( .... ) and
anlagen.tbl_planungsversion.date =3D (select
max(anlagen.tbl_planungsversion.date) from anlagen.tbl_planungsversion
....)


Und/oder:

ein View auf anlagen.tbl_planungsversion, der nur die neueste Version
jeweils beinhaltet, und diesen View in Deine Abfrage einbeziehen. Das
sollte zwar dann auf dasselbe hinauslaufen, sieht aber übersichtlicher
aus und Du hast gleich einen schönen View auf die aktuell gültige
Version der Anlage...


Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47215, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq
andreas.kretschmer [ Mo, 10 April 2006 15:40 ] [ ID #1267738 ]

Re: Join aber nur neusten eintrag anzeigen

-----Ursprüngliche Nachricht-----
Von: rene hankel [mailto:rene.hankel [at] avt-verkehrstechnik.de]
Gesendet: Montag, 10. April 2006 16:51
An: 'A. Kretschmer'
Betreff: AW: [pgsql-de-allgemein] Join aber nur neusten eintrag anzeigen

> -----Ursprüngliche Nachricht-----
> Von: pgsql-de-allgemein-owner [at] postgresql.org
> [mailto:pgsql-de-allgemein-owner [at] postgresql.org] Im Auftrag von A.
> Kretschmer
> Gesendet: Montag, 10. April 2006 15:40
> An: pgsql-de-allgemein [at] postgresql.org
> Betreff: Re: [pgsql-de-allgemein] Join aber nur neusten eintrag
> anzeigen
>
> am 10.04.2006, um 15:11:27 +0200 mailte rene hankel folgendes:
> > Hi,
> >
> > Folgende abfrage(leicht vereinfacht zwecks uebersich):
> >
> > SELECT anlagen.tbl_anlage.id,
> > anlagen.tbl_anlage.standort,
> > anlagen.tbl_anlage.bezeichnung
> > anlagen.tbl_planungsversion.version,
> > anlagen.tbl_planungsversion.date
> > FROM anlagen.tbl_anlage
> > LEFT OUTER JOIN anlagen.tbl_anlagentyp
> > ON anlagen.tbl_anlage.anlagentyp_id =3D
> anlagen.tbl_anlagentyp.id
> > LEFT OUTER JOIN anlagen.tbl_planungsversion
> > ON anlagen.tbl_anlage.id =3D
> > anlagen.tbl_planungsversion.anlage_id
> > WHERE (anlagen.tbl_anlage.id IN ( ....
> >
> >
> > PROBLEM:
> > Die tabelle anlagen.tbl_planungsversion enthaelt alle
> versionen der anlage
> > ueber den zeitraum x.
> > In der tabelle soll aber immer nur die LETZTE version(vom datum her)
> > angezeigt werden. Logischweise Würde die abfrage wie oben funzen,
> > wenn ich sie nach id,
> date sortiere und
> > immer nur die 1. zeile
>
> Wäre eine weitere WHERE-Bedingung auf max(date) nicht das, was Du
> suchst? Also:
>
> WHERE (anlagen.tbl_anlage.id IN ( .... ) and
> anlagen.tbl_planungsversion.date =3D (select
> max(anlagen.tbl_planungsversion.date) from anlagen.tbl_planungsversion
> ...)
>
>
> Und/oder:
>
> ein View auf anlagen.tbl_planungsversion, der nur die neueste Version
> jeweils beinhaltet, und diesen View in Deine Abfrage einbeziehen. Das
> sollte zwar dann auf dasselbe hinauslaufen, sieht aber übersichtlicher=

> aus und Du hast gleich einen schönen View auf die aktuell gültige
> Version der Anlage...
>
>
> Andreas
> --
> Andreas Kretschmer (Kontakt: siehe Header)
> Heynitz: 035242/47215, D1: 0160/7141639
> GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
> =3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq
>




Es hat mir weitergeholfen jedoch funzen die beide dinge nicht direkt, weil
1.) das zusatz 'AND (SELECT...max(date...' bei nicht vorhanden daten,
natuerlich
auch kein ergebnis bringt, was durchaus moeglich ist bei meinen
daten.
*irgendwas ist ja immer*
2.) der view ist auch nett, aber er wuerde nur EINEN eintrag EINER anlage
bringen,
obwohl ich mehrer darstellen moechte.



Grundsaetzlich koennte das ergebnis der joins ohne filter so aussehen:

Id |standort |bezeichnung |version |versionsdate
------------------------------------------------------------ ----------------
----------
1 |da |diese anlage |1.0.0 | 2006.03.12
1 |da |diese anlage |1.1.0 | 2004.04.01
1 |da |diese anlage |1.0.3 | 2006.03.20
1 |da |diese anlage |1.0.1 | 2002.03.20
2 |hier |jene anlage |1.0.6 | 2005.09.11
2 |hier |jene anlage |0.0.9 | 2000.02.21
2 |hier |jene anlage |1.1.5 | 2002.08.01
2 |hier |jene anlage |1.2.0 | 2004.11.01
3 |dort |welchige | |


Ich moechte aber das so, wenn moeglich in einer abfrage:

Id |standort |bezeichnung |version |versionsdate
------------------------------------------------------------ ----------------
----------
1 |da |diese anlage |1.0.3 | 2006.03.20
2 |hier |jene anlage |1.0.6 | 2005.09.11
3 |dort |welchige | |



Ich habe das jetzt so geloest.

=2E
=2E
=2E
FROM anlagen.tbl_anlage
LEFT OUTER JOIN anlagen.tbl_anlagentyp
ON anlagen.tbl_anlage.anlagentyp_id =3D anlagen.tbl_anlagentyp.id
LEFT OUTER JOIN anlagen.tbl_planungsversion
ON (anlagen.tbl_anlage.id =3D anlagen.tbl_planungsversion.anlage_id)
AND
( anlagen.tbl_planungsversion.id IN (
SELECT DISTINCT ON
(anlage_id) id
FROM
anlagen.tbl_planungsversion
ORDER BY anlage_id,
unixtimestamp DESC
)
)
WHERE anlagen.tbl_anlage.id IN (...




FRAGE: gibt es daran ausser dem 'DISTINCT ON' was auszusetzen?


---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
rene hankel [ Di, 11 April 2006 11:45 ] [ ID #1269440 ]
Datenbanken » gmane.comp.db.postgresql.german » Join aber nur neusten eintrag anzeigen

Vorheriges Thema: Pgadmin III: stored procedures via funktionen
Nächstes Thema: Stored procedures