1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

n:m nach 1:1

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von T-Bone Steak, 1 März 2012.

  1. T-Bone Steak

    T-Bone Steak Neuer Benutzer

    Hallo zusammen,

    erstmal "Grüß Gott" das ist mein erster Post hier. :)

    Ich versuche mal, mein Problem halbwegs strukturiert darzustellen:

    Die Entwicklungsumgebung ist SAS. Es steht also SAS Base und SQL zur Verfügung.

    Ich habe 2 Tabellen (T1 und T2), beide haben dieselbe Struktur (also dieselben Felder), beide haben einen PK (PK1 und PK2). Am Schluss soll eine Mapping-Tabelle rauskommen PK1 = PK2.
    Der erste Join geht über die Vergleichsfelder, heraus kommt eine Liste PK1(n) = PK2(m). Das ist soweit auch erstmal richtig.
    Als nächstes habe ich diese Liste nach PK1, PK2 sortiert und mir den jeweils ersten Eintrag der Gruppe geben lassen und dachte, ich wäre fertig. Stimmt aber leider nicht, denn da kommt dummerweise 1:m raus. Es wird also ein PK2 Eintrag auch zu anderen PK1 zugeordnet. Das ist fachlich möglich, wenn aber der Fall vorkommt, soll aus der n:m Beziehung einfach ein anderes m genommen werden bzw. wenn das nicht möglich ist, eben gar nichts gewählt werden.

    Und ich komme einfach nicht drauf, wie das gehen soll...
     
  2. ukulele

    ukulele Datenbank-Guru

    Die selben Felder heist auch die selben Daten? Ich verstehe nicht ganz, welche Daten verknüpft werden sollen, das müsstest du erläutern.

    Erstmal hast du ja, wie beschrieben, ein Kreuzprodukt aus beiden Tabellen. Beispiel:
    (Die Summen der beiden Tabelleneinträge mit einander multipliziert ergibt die Summe des Kreuzproduktes)
    PK1A <-> PK2A
    PK1A <-> PK2B
    PK1A <-> PK2C
    PK1B <-> PK2A
    PK1B <-> PK2B
    PK1B <-> PK2C
    PK1C <-> PK2A
    PK1C <-> PK2B
    PK1C <-> PK2C
     
  3. T-Bone Steak

    T-Bone Steak Neuer Benutzer

    Ich bin mittlerweile auf den Trichter gekommen.
    @Ukulele: Ja, diese Annahme ist korrekt.

    Folgende Lösung:
    a) Sortieren nach PK2
    b) Folgender SAS Code löscht aus PK2 alle Doppelten vorkommen bis auf den ersten
    data foo2;
    set foo1;
    by PK2;
    if not first.PK2 then PK2 = "";
    run;

    c) Sortieren, missing values an den Schluss
    proc sort data = foo2 out = foo3;
    by PK1 DESCENDING PK2;
    run;

    d) Beim jeweils ersten vorkommen von PK1 prüfen, ob PK2 gefüllt ist. Wenn ja, Treffer und ausgeben.
    data foo4;
    set foo3;
    by PK1 DESCENDING PK2;

    if first.PK1 then do;
    if PK2 ne "" then output;
    end;
    run;

    e) FREU!!! Funktioniert.

    Man könnte jetzt einwenden, daß die Auswahl von PK2 ausschließlich nach Sortierung erfolgt und nicht nach qualifizierten
    Bedingungen. Für meinen speziellen Fall ist das egal, aber für Statistiker würde es wohl nicht taugen...
     
  4. ukulele

    ukulele Datenbank-Guru

    :confused: Es tut was es soll...
     

Diese Seite empfehlen