Announcement

Collapse
No announcement yet.

Abfrage auf drei Tabellen - Abfangen doppelter Einträge?

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

  • Abfrage auf drei Tabellen - Abfangen doppelter Einträge?

    Hallo,

    ich habe drei Tabellen:
    T1: Projektdaten
    T2: zu den Projekten gehörende Kontakte
    T3: zu den Kontakten gehörende Vermerke

    Der Normalfall sieht vor, dass es zu einem Projekt einen Kontakt mit einem Vermerk gibt.
    Soweit, sogut...

    Nun kommt es aber auch vor, dass es zu einem Projekt mehrere Kontakte mit je einem Vermerkt gibt. (Vermerk - Kontakt = 1:1)

    Eine Abfrage, diese Projekte mit den entsprechenden Kontaktdaten und Vermerken anzuzeigen ist kein Problem.
    Ich habe dann mehrere Zeilen zu einem Projekt, die sich in den Kontaktdaten und dem entsprechenden Vermerk unterscheiden.
    Anhand des Vermerks soll nun entschieden werden, welcher Kontakt zu dem Projekt zugeordnet werden soll.

    Hier gibt es zum Glück einige Zustände, die eine automatisierte Zuordnung erlauben:
    mögliche Vermerke: A, B, C, D, E

    Es kann sein, dass alle Vermerke zu einem Projekt die gleichen sind. In diesem Fall kann keine Automatisierung erfolgen.

    Findet sich aber der Vermerk A, so ist dies niemals das richtige Kontakt. Es ist also immer der andere Vermerk.

    Bsp:

    Vermerk 1, Vermerk2: Zuweisung
    A, A: nicht automatisierbar
    A, B: B
    A, C: C
    A, D: D
    A, E: E
    B, B: nicht automatisierbar
    B, C: nicht automatisierbar
    B, D: nicht automatisierbar
    B, E: nicht automatisierbar
    C, C: nicht automatisierbar
    C, D: nicht automatisierbar
    C, E: nicht automatisierbar
    D, D: nicht automatisierbar
    D, E: nicht automatisierbar

    Da die meisten Ergebnisse meist ein A haben und einen anderen Buchstaben, wäre hier eine Abfrage hilfreich, die immer den Vermerk anzeigt, der nicht A ist.


    Beispiel:

    Tabelle 1:
    ID / Projekt/ Status
    83 / Bayern1 / o (offen)

    Tabelle 2:
    ID / T1_ID/ Kontakt
    1 / 83 / K1
    2 / 83 / K2

    Tabelle 3:
    ID / T2_ID / Vermerk
    29 / 1 / A
    30 / 2 / B


    Die Abfrage:
    SELECT T1.ID, T1.projekt, T2.ID, T2.Kontakt, T3.Vermerk
    FROM T1, T2, T3
    WHERE T2.T1_ID = T1.ID
    AND T1.Status = 'offen'
    AND T2.ID = T3.T2_ID
    ORDER BY T1.ID, T2.ID

    Ergebnis meiner Abfrage:

    T1_ID / Projekt / T2_ID / Kontakt / Vermerk
    83 / Bayern1 / 1 / K1 / A
    83 / Bayern1 / 2 / K2 / B
    ...


    nun versuche ich eine Abfrage zu machen, die mir NUR den Treffer mit dem Eintrag B beim Vermerk anzeigt, damit ich damit einen UPDATE machen kann.
    Leider bekomme ich es nicht hin.

    Ich hoffe, ich habe das Problem gut beschrieben und es kann mir hier jemand hilfreiche Tips geben.

    mfG,
    Marco
    Zuletzt editiert von marco_de; 27.04.2010, 08:49.

  • #2
    Hallo,
    ist mein Problem zu kompliziert oder drücke ich mich unverständlich aus?

    Comment


    • #3
      Hallo,
      Originally posted by marco_de View Post
      ...nun versuche ich eine Abfrage zu machen, die mir NUR den Treffer mit dem Eintrag B beim Vermerk anzeigt, damit ich damit einen UPDATE machen kann.
      Füge einfach ein AND T3.Vermerk = 'B' in die Where-Klausel ein.

      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


      • #4
        Originally posted by marco_de View Post
        Die Abfrage:
        SELECT T1.ID, T1.projekt, T2.ID, T2.Kontakt, T3.Vermerk
        FROM T1, T2, T3
        WHERE T2.T1_ID = T1.ID
        AND T1.Status = 'offen'
        AND T2.ID = T3.T2_ID
        ORDER BY T1.ID, T2.ID

        Ergebnis meiner Abfrage:

        T1_ID / Projekt / T2_ID / Kontakt / Vermerk
        83 / Bayern1 / 1 / K1 / A
        83 / Bayern1 / 2 / K2 / B
        ...
        Hallo Falk,

        vielen Dank für Deine Antwort! Leider habe ich mich wohl doch etwas unverständlich ausgedrückt, daher löst dein Vorschlag nicht mein Problem.

        Ich versuche es noch einmal

        also die Abfrage liefert mir immer mehrere Zeilen (meist zwei), wo T1_ID und Projekt identisch sind.
        Nun kann es sein, dass in diesen (beiden) Zeilen der Vermerk JEWEILS B ist.
        Genau diesen Fall, und NUR diesen Fall möchte ich mit der Abfrage anzeigen lassen.


        Ergebnis meiner Abfrage:

        T1_ID / Projekt / T2_ID / Kontakt / Vermerk
        83 / Bayern1 / 1 / K1 / A
        83 / Bayern1 / 2 / K2 / B
        84 / Bayern3 / 3 / K8 / B
        84 / Bayern3 / 4 / K7 / B

        85 / Bayern5 / 5 / K6 / A
        85 / Bayern5 / 6 / K5 / B
        86 / Bayern7 / 7 / K4 / B
        86 / Bayern7 / 7 / K3 / B

        87 / Bayern8 / 9 / K0 / A
        87 / Bayern8 / 0 / K9 / B
        ...

        die gewünschten Zeilen habe ich hier mal markiert.


        Wie muss ich die Abfrage verändern, damit ich NUR die grünen Zeilen (T1_ID=84) angezeigt bekomme? Ich brauche dann aber schon alle Zeilen, nicht nur eine!

        Ergebnis DER GESUCHTEN Abfrage:

        T1_ID / Projekt / T2_ID / Kontakt / Vermerk
        84 / Bayern3 / 3 / K8 / B
        84 / Bayern3 / 4 / K7 / B

        86 / Bayern7 / 7 / K4 / B
        86 / Bayern7 / 7 / K3 / B

        ...





        Kann mir da jemand helfen?

        Grüße,
        Marco

        Comment


        • #5
          Hallo,
          Originally posted by marco_de View Post
          ...Leider habe ich mich wohl doch etwas unverständlich ausgedrückt, daher löst dein Vorschlag nicht mein Problem.
          Das hab ich mir gedacht .

          Die zusätzliche Bedingung ist dann wohl eher, das die Anzahl der Gruppe T1.ID, T1.projekt für T3.Vermerk = B größer als 1 ist.
          Also in etwa so:
          [highlight=sql]
          SELECT T1.ID, T1.projekt, T2.ID, T2.Kontakt, T3.Vermerk
          FROM T1
          inner join T2 on T2.T1_ID = T1.ID
          inner join T3 on T3.T2_ID = T2.ID
          WHERE T1.Status = 'offen'
          and T3.Vermerk = 'B'
          and exists (
          select T1a.ID, T1a.projekt
          from T1 T1a
          inner join T2 T2a on T2a.T1_ID = T1a.ID
          inner join T3 T3a on T3a.T2_ID = T2a.ID
          where T1a.ID = T1.ID
          and T1a.projekt = T1.projekt
          and T3a.Vermerk = T3.Vermerk
          group by T1a.ID, T1a.projekt
          having count(*) > 1
          )
          ORDER BY T1.ID, T2.ID
          [/highlight]

          Und bitte beachten: Formatierung von SQL in Beiträgen

          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
            Hallo Falk,

            vielen Dank für deine schnelle Antwort. Den Hinweis auf die Formatierung von SQL werde ich zukünftig beachten
            Leider klappts mit der Lösung auch nicht wie gewünscht.
            Der Fehler liegt aber wohl eher bei mir ...


            Ich habe mir inzwischen eine neue Tabelle erstellt und mit meinen Daten aus der Anfangsabfrage gefüllt. Jetzt möchte ich diese Stück für Stück bearbeiten, wobei ich aber eine vermeindlich triviale Abfrage nicht hinbekomme.

            Die Tabelle sieht nun so aus:


            T1_ID / Projekt / T2_ID / Kontakt / Vermerk
            83 / Bayern1 / 1 / K1 / A
            83 / Bayern1 / 2 / K2 / B
            84 / Bayern3 / 3 / K8 / B
            84 / Bayern3 / 4 / K7 / B

            85 / Bayern5 / 5 / K6 / A
            85 / Bayern5 / 6 / K5 / B
            86 / Bayern7 / 7 / K4 / B
            86 / Bayern7 / 7 / K3 / B

            87 / Bayern8 / 9 / K0 / A
            87 / Bayern8 / 0 / K9 / B


            Ich möchte nun alle Zeilen sehen, bei denen T1_ID UND Projekt UND Vermerk identisch sind.
            Hier wieder grün dargestellt.

            Ziel wäre also das:

            T1_ID / Projekt / T2_ID / Kontakt / Vermerk
            84 / Bayern3 / 3 / K8 / B
            84 / Bayern3 / 4 / K7 / B
            86 / Bayern7 / 7 / K4 / B
            86 / Bayern7 / 7 / K3 / B
            ...


            Kann mir bitte jemand auf die Sprünge helfen?

            Comment


            • #7
              Hallo,
              Originally posted by marco_de View Post
              ...Kann mir bitte jemand auf die Sprünge helfen?
              Frage aus der Tabelle die Datensätze ab, zu denen jeweils in der gleichen Tabelle mindestens ein DS EXIST(S)iert, der in T1_ID UND Projekt UND Vermerk gleich ist UND sich gleichzeitig in T2_ID ODER Kontakt unterscheidet.
              Diese Beschreibung brauchst du jetzt nur noch in SQL zu formulieren.

              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

              Working...
              X