Probleme bei einer Abfrage

Hallo Leute,

habe ein Problem eine Abfrage zu erstellen. Es handelt sich da um eine etwas kompliziertere Sache. Ich möchte alle Orte, Straßen, PLZ und Telefonummern davon abfragen.

Das Problem ist: Die Daten Ort, PLZ, Straße usw. sind in einer Tabelle. Es gibt eine extra Tabelle für die Telefonnummern, wo aber teilweise mehrere Rufnummern einem Standort zugeordnet sind. Bei meiner Abfrage bekomme ich natürlich manche Standorte doppelt und dreifach ausgegeben, mit jeweils den verschiedenen Rufnummern. Ich möchte aber jeden Standort nur einmal ausgegeben haben mit der ersten Rufnummer, die die Abfrage findet.

Die Tabelle Standort hat einen Primary-Key über den die Tabelle Telefonnummer verbunden ist.
Die Tabelle Telefonnummer hat einen eigenen Primary-Key. Der Key der Standort Tabelle ist hier nicht unique.

Kann mir jemand helfen?

PG hat eine Erweiterung, nennt sich DISTINCT ON. Das kannst Du dazu verwenden.
PostgreSQL: Documentation: Manuals: PostgreSQL 8.1: SELECT


[php]
test=# create table standort (id int primary key, ort text, plz text);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index “standort_pkey” for table “standort”
CREATE TABLE
test=# create table rufnummer (standort int references standort, tel text);
CREATE TABLE
test=
# insert into standort values (1, ‘kaufbach’, ‘01732’);
INSERT 0 1
test=# insert into standort values (2, ‘dresden’, ‘01011’);
INSERT 0 1
test=
# insert into rufnummer values (1,‘0815’);
INSERT 0 1
test=# insert into rufnummer values (1,‘4711’);
INSERT 0 1
test=
# insert into rufnummer values (2,‘3333’);
INSERT 0 1
test=*# select s.ort, s.plz, r.tel from standort s left join rufnummer r on s.id=r.standort;
ort | plz | tel
----------±------±-----
kaufbach | 01732 | 0815
kaufbach | 01732 | 4711
dresden | 01011 | 3333
(3 rows)

test=*# select distinct on (s.ort) s.ort, s.plz, r.tel from standort s left join rufnummer r on s.id=r.standort;
ort | plz | tel
----------±------±-----
dresden | 01011 | 3333
kaufbach | 01732 | 0815
(2 rows)

test=*# select distinct on (s.ort) s.ort, s.plz, r.tel from standort s left join rufnummer r on s.id=r.standort order by s.ort, r.tel;
ort | plz | tel
----------±------±-----
dresden | 01011 | 3333
kaufbach | 01732 | 0815
(2 rows)

test=*# select distinct on (s.ort) s.ort, s.plz, r.tel from standort s left join rufnummer r on s.id=r.standort order by s.ort, r.tel desc;
ort | plz | tel
----------±------±-----
dresden | 01011 | 3333
kaufbach | 01732 | 4711
(2 rows)

[/php]

Du könntest natürlich Dir pro Ort auch eine Liste der Rufnummern erzeugen:

[php]
test=*# select distinct s.ort, s.plz, array_to_string(array(select tel from rufnummer where standort=s.id),‘,’) from standort s left join rufnummer r on s.id=r.standort;
ort | plz | array_to_string
----------±------±----------------
dresden | 01011 | 3333
kaufbach | 01732 | 0815,4711
[/php]

… aber das wolltest Du ja nicht.


Andreas

Vielen Dank für die Mühe akretschmer, aber ich habe leider gerade festgestellt, das es nicht funktioniert (habs auch umgestellt usw.), weil ich mich im falschen Forum angemeldet habe, ich hab nämlich garnicht PG in use sondern Microsoft SQL.

Ein schönes WE

MfG

le cram

lol… nadenn, viel erfolg dort :wink:

Herzliches Beileid :wink:

Andreas

Nicht wirklich, oder?

Wenn ich so recht zurückdenke, bist du aber nicht der einzige, dem das passiert. Vielleicht solltest du die Datenbank wechseln …