Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von 0815joe, 4 Juli 2013.

  1. 0815joe

    0815joe Benutzer

    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?
     
  2. 0815joe

    0815joe Benutzer

    Schreibfehler passiert.

    Statt .EM_ADR sollte .EM_ADR stehen
     
  3. akretschmer

    akretschmer Datenbank-Guru

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

    0815joe Benutzer

    Hab ich ja. Nur verknüpft der nicht mehrere Tabellen miteinander.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Die Verknüpfung ist doch nicht Dein Problem, oder? Du willst den ersten Record pro Gruppe, oder? Also, erste Mail/Adresse pro Kunde. Einfach abstrahieren. Okay?
     
  6. 0815joe

    0815joe Benutzer

    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.
     
  7. 0815joe

    0815joe Benutzer

    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
     
  8. akretschmer

    akretschmer Datenbank-Guru


    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=*#
    
     
    ukulele gefällt das.
  9. 0815joe

    0815joe Benutzer

    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!
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Einmal 'Gefällt mir' drücken reicht ;-)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden