3 Tabellen verknüpfen und nur den ersten Eintrag pro "Kunden" auswerfen

0815joe

Benutzer
Beiträge
6
Hallo

Kämpfe schon den halben Tag mit diesem Statement und gebe schön langsam auf.

Grundsätzlich gehts darum drei Tabellen zu verknüfen (1x Kunden, 1x EMail, 1x Adressen)
Gemein haben alle Adressen die Kunden_ID.

Mein derzeitiges Statement ist:

select
[Kunde].KND_NUMMER,
[KUNDE].KND_NAME,
[ADRESSE].ADR_STRASSE,
[ADRESSE].ADR_ORT,
[ADRESSE].ADR_PLZ,
.EM_ADR,
[EMAIL].REPL_TS
from dbo.KUNDE
left outer join dbo.ADRESSE on dbo.ADRESSE.KND_ID = dbo.KUNDE.KND_ID
left outer join dbo.Email on dbo.email.KND_ID = dbo.KUNDE.KND_ID

Jeder Kunde kann mehrere Email Adressen bzw. Adressen haben und wird somit mehrmals in der Kundentabelle angeführt. Es soll aber nur jeweils die Erste Email bzw. die erste Adresse angezeigt werden.

Meine Vorgangsweise wäre gewesen nach REPL_TS zu "aggregieren?" und dann nur den Eintrag mit der "neuesten EMail" auszugeben. Scheitere aber an der Syntax.

Es ist aber auch möglich das ein Kunde keine Email Adresse besitzt. Dieser sollte aber natürlich trotzdem angezeigt werden.

Habt Ihr eine Idee?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.830
Hallo

Kämpfe schon den halben Tag mit diesem Statement und gebe schön langsam auf.


Jeder Kunde kann mehrere Email Adressen bzw. Adressen haben und wird somit mehrmals in der Kundentabelle angeführt. Es soll aber nur jeweils die Erste Email bzw. die erste Adresse angezeigt werden.


Habt Ihr eine Idee?

Ja. Lies einfach mal den Thread vor Dir. Ähnliche Frage, selbe Lösung, welch ein Zufall.
 

0815joe

Benutzer
Beiträge
6
Sorry. Bin noch nicht so drauf. Ist mein zweiter Tag mit SQL. Wenn du sagst, ich kann das mit dem partition machen dann lese ich mich da mal rein. Danke für den Tipp.
 

0815joe

Benutzer
Beiträge
6
Hat vielleicht noch jemand eine Idee?

Ich bekomms einfach nicht hin. SQL ist spanisch für mich. Ich finde zwar einige Infos zu partition by nur die beziehen sich darauf spalten mit gleichen werten zu einer "ID" zusammenzuführen. Mein zuvor verwendetes Script liefert mir dir Information ja schon in der Kundennummer. Wie bekomme ich jetzt auf den ersten Eintrag.

select [Kunde].KND_NUMMER, [KUNDE].KND_NAME,[ADRESSE].ADR_STRASSE,[ADRESSE].ADR_ORT,[ADRESSE].ADR_PLZ,.EM_ADR,[EMAIL].REPL_TS
from
(select *,ROW_NUMBER() over (partition by [kunde].knd_nummer order by [EMail].Repl_ts desc) as c from dbo.KUNDE) foo
left outer join dbo.ADRESSE on dbo.ADRESSE.KND_ID = dbo.KUNDE.KND_ID
left outer join dbo.Email on dbo.email.KND_ID = dbo.KUNDE.KND_ID
where c=1
 

akretschmer

Datenbank-Guru
Beiträge
9.830
Hat vielleicht noch jemand eine Idee?

Ich bekomms einfach nicht hin. SQL ist spanisch für mich. Ich finde zwar einige Infos zu partition by nur die beziehen sich darauf spalten mit gleichen werten zu einer "ID" zusammenzuführen. Mein zuvor verwendetes Script liefert mir dir Information ja schon in der Kundennummer. Wie bekomme ich jetzt auf den ersten Eintrag.


Code:
test=*# create table kunde (id int, name text);
CREATE TABLE
test=*# create table adresse (kunde_id int, adresse text);
CREATE TABLE
test=*# create table email (kunde_id int, email text);
CREATE TABLE
test=*# insert into kunde values (1, 'kunde1');
INSERT 0 1
test=*# insert into kunde values (2, 'kunde2');
INSERT 0 1
test=*# insert into adresse values (1,'adresse1_1');
INSERT 0 1
test=*# insert into adresse values (1,'adresse1_2');
INSERT 0 1
test=*# insert into adresse values (1,'adresse1_3');
INSERT 0 1
test=*# insert into email values (1, 'email1_1');
INSERT 0 1
test=*# insert into email values (2, 'email2_1');
INSERT 0 1
test=*# insert into email values (2, 'email2_2');
INSERT 0 1
test=*# insert into email values (2, 'email2_3');
INSERT 0 1
test=*# select k.name, a.adresse, e.email from kunde k left join adresse a on k.id=a.kunde_id left join email e on k.id=e.kunde_id);
ERROR:  syntax error at or near ")"
LINE 1: ... a on k.id=a.kunde_id left join email e on k.id=e.kunde_id);
                                                                     ^
test=*# select k.name, a.adresse, e.email from kunde k left join adresse a on k.id=a.kunde_id left join email e on (k.id=e.kunde_id);
  name  |  adresse   |  email
--------+------------+----------
 kunde1 | adresse1_1 | email1_1
 kunde1 | adresse1_2 | email1_1
 kunde1 | adresse1_3 | email1_1
 kunde2 |            | email2_1
 kunde2 |            | email2_2
 kunde2 |            | email2_3
(6 rows)

test=*# select k.name, a.adresse, e.email, row_number() over (partition by name) c from kunde k left join adresse a on k.id=a.kunde_id left join email e on (k.id=e.kunde_id);
  name  |  adresse   |  email   | c
--------+------------+----------+---
 kunde1 | adresse1_1 | email1_1 | 1
 kunde1 | adresse1_2 | email1_1 | 2
 kunde1 | adresse1_3 | email1_1 | 3
 kunde2 |            | email2_1 | 1
 kunde2 |            | email2_2 | 2
 kunde2 |            | email2_3 | 3
(6 rows)

test=*# select * from (select k.name, a.adresse, e.email, row_number() over (partition by name) c from kunde k left join adresse a on k.id=a.kunde_id left join email e on (k.id=e.kunde_id)) bla where c=1;
  name  |  adresse   |  email   | c
--------+------------+----------+---
 kunde1 | adresse1_1 | email1_1 | 1
 kunde2 |            | email2_1 | 1
(2 rows)

test=*#
 

0815joe

Benutzer
Beiträge
6
1,5 millionenfachen Dank :).

Hätte ich noch eine Woche dran arbeiten können.
Zwei Änderungen musste ich noch durchführen (Order by und die variablen nach den Tabellennamen) und jetzt läufts.

select * from (select [Kunde].KND_NUMMER,[KUNDE].KND_NAME,[ADRESSE].ADR_STRASSE,[ADRESSE].ADR_ORT,[ADRESSE].ADR_PLZ,.EM_ADR,[email].REPL_TS, row_number() over (partition by [Kunde].KND_NUMMER order by [Email].repl_ts) c from kunde
left join adresse on dbo.KUNDE.KND_ID=dbo.ADRESSE.KND_ID
left join email on (dbo.KUNDE.KND_ID=dbo.email.KND_ID)) bla where c=1;

Danke nochmal!
 
Werbung:
Oben