Announcement

Collapse
No announcement yet.

Ehegatten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ehegatten

    Hallo,

    möglich das es einfach ist, stehe vor folgendem Problem.
    Ich möchte eine Liste mit Ehegatten generieren ... Muster

    Spalte 1 = Ehegatte 1
    Spalte 2 = Ehegatte 2

    Ich habe eine Ehegattentabelle und eine Personentabelle, die Ehegatten werden willkürlich in die Ehegattentabelle eingetragen. Meine Liste soll aber auch die nicht verheirateten Personen zeigen und alle Personen aus der Personentabelle. Folglich soll jede Person einmal in Spalte 1 erscheinen mit dem entsprechenden Ehegatten, auch wenn er in der Ehegattentabelle in Spalte 2 eingetragen ist. D.h. die Datensätze aus der Ehegattentabelle müssen zweimal erscheinen, in der Ehegattentabelle erscheinen diese aber nur einmal ... Aufbau Ehegatte1, Ehegatte2, von, bis

    Ich habe mal das Script mit beigepackt, was aber noch nicht das gewünschte Ergebnis bringt ...

    SELECT Personen.PersName, Personen_1.PersName AS Ehe1, Personen_2.PersName AS Ehe2,Ehegatten.VerheiratetVon as VON,
    Ehegatten.VerheiratetBis BIS

    FROM Ehegatten INNER JOIN
    Personen AS Personen_1 ON Ehegatten.Ehegatte1ID = Personen_1.PersID INNER JOIN
    Personen AS Personen_2 ON Ehegatten.Ehegatte2ID = Personen_2.PersID RIGHT OUTER JOIN
    Personen ON Ehegatten.Ehegatte2ID = Personen.PersID OR Ehegatten.Ehegatte1ID = Personen.PersID

    WHERE Ehegatten.VerheiratetBis is Null

    ORDER BY Personen.PersName, Ehegatten.VerheiratetVon

    kann da jemand mal unter die Arme greifen ???

    Danke

  • #2
    [highlight=sql]
    SELECT p1.PersName as Person, p2.PersName as Ehegatte, g.VerheiratetVon, g.VerheiratetBis
    FROM Personen p1
    LEFT OUTER JOIN Ehegatten g ON p1.PersID = g.Ehegatte1ID
    INNER JOIN Personen p2 ON p2.PersID = g.Ehegatte2ID
    WHERE g.VerheiratetBis is null
    ORDER BY p1.PersName, g.VerheiratetVon
    [/highlight]

    Das WHERE und ORDER BY hab ich aus Deinem Statement entnommen. Bin mir nicht sich ob man das WHERE braucht. Sortieren dürfte aber nicht schaden.

    Comment


    • #3
      Danke schon mal für deine Antwort, ist aber leider noch nicht das gelbe vom Ei. Ich erhalte mit dem Script zwei Datensätze zurück. Erwarte aber eigentlich 5 zurück.
      Ich habe in der Tabelle 5 Personen,
      1 Person ist nicht verheiratet
      2 Person ist mit 3 verheiratet
      4 ist mit 5 verheiratet
      Das verheiraten findet wie beschrieben in der Ehegatten Tabelle statt. In dieser Tabelle sind die Spalten Ehegatte 1 und Ehegatte 2, damit ich beim Verheiraten nur einen Datensatz schreiben muss. Nun ist mein Wunschdenken, dass ich als Ergebnis folgende Liste erhalte

      1 Person : NULL : NULL :NULL
      2 Person : 3 Person : VON : BIS
      3 Person : 2 Person : VON : BIS
      4 Person : 5 Person : VON : BIS
      5 Person : 4 Person : VON : BIS

      Möglich auch dass mein Ansatz falsch ist, aber da muss es doch was geben

      Gruß

      Comment


      • #4
        So jetzt aber Ich habs nun auch getestet. Sogar mit Beispieldaten für eine Oracle Datenbank. with ... as dient nur zum erzeugen von Beispieldaten. Wenn Du keine Oracle DB hast kannst Du die beiden Statements einfach ignorieren.

        [highlight=sql]
        with Personen as
        (
        SELECT 'Person1' PersName, 1 PersID FROM DUAL
        UNION ALL
        SELECT 'Person2' PersName, 2 PersID FROM DUAL
        UNION ALL
        SELECT 'Person3' PersName, 3 PersID FROM DUAL
        UNION ALL
        SELECT 'Person4' PersName, 4 PersID FROM DUAL
        UNION ALL
        SELECT 'Person5' PersName, 5 PersID FROM DUAL
        UNION ALL
        SELECT 'Person6' PersName, 6 PersID FROM DUAL
        ),
        Ehegatten as
        (
        SELECT 2 Ehegatte1ID, 3 Ehegatte2ID, TO_DATE('01.01.2010','DD.MM.YYYY') VerheiratetVon, null VerheiratetBis FROM DUAL
        UNION ALL
        SELECT 4 Ehegatte1ID, 5 Ehegatte2ID, TO_DATE('02.02.2002','DD.MM.YYYY') VerheiratetVon, TO_DATE('03.03.2003','DD.MM.YYYY') VerheiratetBis FROM DUAL
        UNION ALL
        SELECT 4 Ehegatte1ID, 6 Ehegatte2ID, TO_DATE('04.04.2004','DD.MM.YYYY') VerheiratetVon, null VerheiratetBis FROM DUAL
        )
        SELECT
        p1.PersID AS Person1ID,
        p1.PersName AS Person,
        p2.PersID AS Person2ID,
        p2.PersName AS Ehegatte,
        NVL(g1.VerheiratetVon,g2.VerheiratetVon) as VerheiratetVon,
        NVL(g1.VerheiratetBis,g2.VerheiratetBis) as VerheiratetBis
        FROM Personen p1
        LEFT OUTER JOIN Ehegatten g1 ON p1.PersID = g1.Ehegatte1ID
        LEFT OUTER JOIN Ehegatten g2 ON p1.PersID = g2.Ehegatte2ID
        LEFT OUTER JOIN Personen p2 ON p2.PersID = g1.Ehegatte2ID OR p2.PersID = g2.Ehegatte1ID
        ORDER BY p1.PersName
        [/highlight]

        Comment


        • #5
          Hallo,

          ein Punkt wurde noch nicht geklärt. Was ist mit Leuten die verheiratet waren, also bei denen VerheiratetBis nicht NULL ist? Sollen die
          a) gar nicht
          b) mit verheiratet bis
          c) als ledig
          aufgelistet werden?
          Bei a) fehlt noch die entsprechende Where-Klausel. b) entspricht der aktuellen Lösung und bei c) müsste die Bedingung noch in die ON-Bedingung des Joins.

          Hier mal noch eine Lösung für c), die die Ehegatten-Tabelle nur einmal joined und demzufolge ohne NVL im Select auskommt.
          [highlight=sql]
          select p1.PersName, p2.PersName, e.VerheiratetVon, e.VerheiratetBis
          from personen p1
          left join ehegatten e
          on (e.Ehegatte1ID = p1.PersID or e.Ehegatte2ID = p1.PersID)
          and e.VerheiratetBis is null
          left join personen p2
          on (e.Ehegatte1ID = p2.PersID or e.Ehegatte2ID = p2.PersID)
          and p2.PersID != p1.PersID
          [/highlight]

          Was ist mit Personen die mehrfach verheiratet waren / sind?

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Na da zieh ich aber meinen Hut ... danke

            Das Statement berücksichtigt den aktuellen Stand ... mit bis begrenze ich ein, ist von gefüllt und bis "is NULL" dann bekomme ich den aktuellen Stand. So kann ich mit den Daten auch in die Vergangenheit "reisen". Aber bei geschiedenen Personen muss ich mir noch was einfallen lassen.
            Ich sag nochmal danke

            Comment


            • #7
              ... aktueller Stand wird dann natürlich nur mit der entsprechenden Where Klausel (bis is null) berücksichtigt

              Comment

              Working...
              X