gegeben sind folgende Tabellen:
- Code: Alles auswählen
BRP=# select * from testkunden;
personennr | nachname | vorname | geburtsdatum
------------+----------+------------------------------+--------------
0000000001 | Meier | Markus | 1980-01-01
0000000002 | Meier | Maria | 1990-01-01
0000000003 | Meier | Markus und Maria |
0000000004 | Müller | Angela | 1950-01-01
0000000005 | Huber | Angela | 1970-01-01
0000000006 | Huber | Ariane | 1976-01-01
0000000007 | Huber | Annabella | 1978-01-01
0000000008 | Huber | Angela, Ariane und Annabella |
(8 rows)
- Code: Alles auswählen
BRP=# select * from testkunden_beziehungen;
personennr | personennr_2_kunde
------------+--------------------
0000000003 | 0000000001
0000000003 | 0000000002
0000000008 | 0000000005
0000000008 | 0000000006
0000000008 | 0000000007
(5 rows)
Wie man sieht, sind manche Kunden alleine, manche haben zusätzlich zur eigenen noch eine gemeinsame Kundennummer.
Nun möchte ich:
1. alle Kunden (wenn ein gemeinsamer Kundenstamm vorhanden ist nur diesen, ansonsten den einzelnen), die vor dem 31. Mai 1981 geboren sind
2. wie 1., allerdings dass nur die gemeinsamen Kundenstämme angezeigt werden, bei denen alle Kunden vor dem 31. Mai 1981 geboren sind.
Nr. 1 ist soweit kein Problem, zwar nicht elegant, aber es geht:
- Code: Alles auswählen
BRP=# select distinct a.personennr, a.nachname, a.vorname, a.geburtsdatum from testkunden a
BRP-# left join testkunden_beziehungen b
BRP-# on a.personennr = b.personennr
BRP-# where
BRP-# (
BRP(# a.geburtsdatum < '1981-05-31' or a.personennr in
BRP(# (select distinct a.personennr from testkunden_beziehungen a inner join testkunden b on a.personennr_2_kunde = b.personennr where b.geburtsdatum < '1981-05-31')
BRP(# )
BRP-# and a.personennr not in (select distinct personennr_2_kunde from testkunden_beziehungen);
personennr | nachname | vorname | geburtsdatum
------------+----------+------------------------------+--------------
0000000008 | Huber | Angela, Ariane und Annabella |
0000000003 | Meier | Markus und Maria |
0000000004 | Müller | Angela | 1950-01-01
(3 rows)
Bei meiner zweiten Abfrage dürfte also die Personennr 0000000003 nicht mehr im Ergebnis sein.
Habt ihr einen guten Ansatz für mich, ggf. auch zur "verschönerung" der 1. Abfrage?
Achja,....
- Code: Alles auswählen
BRP=# select version();
version
----------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 8.4.4 on x86_64-unknown-linux-gnu, compiled by GCC gcc (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292], 64-bit
(1 row)
Eine neuere Version ist leider nicht möglich.
Danke + Gruß
Toni

