Announcement

Collapse
No announcement yet.

Probleme mit Join Abfrage bei verschiedenen Werten

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

  • Probleme mit Join Abfrage bei verschiedenen Werten

    Hallo,

    hab ein kleines Problem mit einem Join bei einer SQL Abfrage.

    Normalerweise wird sieht ja ein Join so aus:

    Select * from TABLE1 INNER JOIN TABLE2 on TABLE1.field1 = TABLE2.field1 and TABLE1.field3 = TABLE2.field3 .

    Soweit, so gut. Wenn in TABLE1.field1 "a" steht und in TABLE1.field3 "b", dann werden alle Sätze der anderen Tabelle gejoined, bei denen TABLE2.field1 "a" ist und TABLE2.field3 "b".

    Was ist nun, wenn es einen Sonderfall geben würde, bei dem TABLE1.field1 "y" ist, aber dieses "y" immer mit TABLE2.field1 "z" gejoined werden soll? Geht das?

    Ich versuch mal es mit einem Beispiel darzustellen:

    Tabelle 1
    Feld1 - - - - - - - - - - - - - - - Feld2
    801 - - - - - - - - - - - - - - - - 100001
    801 - - - - - - - - - - - - - - - - 100002
    801 - - - - - - - - - - - - - - - - 100003
    850 - - - - - - - - - - - - - - - - 100001
    850 - - - - - - - - - - - - - - - - 100002
    850 - - - - - - - - - - - - - - - - 100003
    302 - - - - - - - - - - - - - - - - 100001
    302 - - - - - - - - - - - - - - - - 100002
    302 - - - - - - - - - - - - - - - - 100003


    Tabelle 2
    Feld1 - - - - - - - - - - - - - - - Feld2
    801 - - - - - - - - - - - - - - - - 100001
    801 - - - - - - - - - - - - - - - - 100002
    801 - - - - - - - - - - - - - - - - 100003
    850 - - - - - - - - - - - - - - - - 100001
    850 - - - - - - - - - - - - - - - - 100002
    850 - - - - - - - - - - - - - - - - 100003
    301 - - - - - - - - - - - - - - - - 100001
    301 - - - - - - - - - - - - - - - - 100002
    301 - - - - - - - - - - - - - - - - 100003

    Nun möchte ich, dass alles aus Tabelle 1 über beide Felder mit Tabelle 2 gejoined wird. Ausnahme ist "302" aus Tabelle 1 Feld 1, dass mit Tabelle 2 Feld 2 "301" und Feld 2 gejoined werden soll.

    Wenn also alles so gejoined ist wie ich mir das vorgestellt habe, müsste das Ergebnis so aussehen:

    Tabelle1.Feld1-------Tabelle1.Feld2-------Tabelle2.Feld1-------Tabelle2.Feld2
    302--------------------100001----------------301---------------------100001
    302--------------------100002----------------301---------------------100002
    302--------------------100003----------------301---------------------100003


    Ich hoffe jemand konnte mein Problem verstehen und hat hoffentlich eine Lösung hierfür.

  • #2
    In einem JOIN kann eine beliebige Bedingung stehen. Allerdings kann man das ganze dann auch in der WHERE Klause formulieren. Ein wirklich JOIN ist das ja nicht mehr.
    Du erzeugst Dir quasi ein kartesisches Produkt und nimmst dann daraus die Datensatz die Du brauchst:

    [highlight=sql]
    SELECT *
    FROM Tabelle1 t1,
    Tabelle2 t2
    WHERE
    (
    -- wähle Zeilen bei denen 302 -> 301 und Feld2 gleich
    (t1.Feld1 = 302 AND t2.Feld1 = 301)
    AND
    (t1.Feld2 = t2.Feld2)
    )
    OR
    (
    -- wähle Zeilen bei denen !(302 -> 301) und beide Felder stimmen überein
    (t1.Feld1 != 302 AND t2.Feld1 != 301)
    AND
    (t1.Feld1 = t2.Feld1 AND t1.Feld2 = t2.Feld2)
    )
    [/highlight]

    Soweit ich weiss ist die JOIN Syntax nur eine einfachere Darstellung. Da dies aber kein einfacher JOIN ist würde ich das auch so schreiben, dann sieht man direkt dass mehr Logik dahinter steckt.
    Zuletzt editiert von fanderlf; 30.11.2010, 15:42.

    Comment


    • #3
      Hallo,

      vielen Dank, aber hab woanders ne Antwort vorher bekommen.

      Es ist dann immer noch mit einem Join möglich und zwar sieht es dann wie folgt aus:

      Code:
      ... ON (
        (TABLE1.field1 = TABLE2.field1 and TABLE1.field3 = TABLE2.field3 ) OR
        (TABLE1.field1 = 455 AND TABELE2.field1 = 451)
      )

      Comment


      • #4
        Originally posted by fanderlf View Post
        Soweit ich weiss ist die JOIN Syntax nur eine einfachere Darstellung. Da dies aber kein einfacher JOIN ist würde ich das auch so schreiben, dann sieht man direkt dass mehr Logik dahinter steckt.
        Wo ist da das Problem, ON statt WHERE und schon ist der JOIN fertig...
        [highlight=sql]WITH Tabelle1
        ( Feld1
        , Feld2
        )
        AS ( SELECT 801 , 100001 UNION ALL
        SELECT 801 , 100002 UNION ALL
        SELECT 801 , 100003 UNION ALL
        SELECT 850 , 100001 UNION ALL
        SELECT 850 , 100002 UNION ALL
        SELECT 850 , 100003 UNION ALL
        SELECT 302 , 100001 UNION ALL
        SELECT 302 , 100002 UNION ALL
        SELECT 302 , 100003
        )
        , Tabelle2
        ( Feld1
        , Feld2
        )
        AS ( SELECT 801 , 100001 UNION ALL
        SELECT 801 , 100002 UNION ALL
        SELECT 801 , 100003 UNION ALL
        SELECT 850 , 100001 UNION ALL
        SELECT 850 , 100002 UNION ALL
        SELECT 850 , 100003 UNION ALL
        SELECT 301 , 100001 UNION ALL
        SELECT 301 , 100002 UNION ALL
        SELECT 301 , 100003
        )
        SELECT *
        FROM Tabelle1 AS t1
        JOIN Tabelle2 AS T2 ON (-- wähle Zeilen bei denen 302 -> 301 und Feld2 gleich
        (t1.Feld1 = 302 AND t2.Feld1 = 301)
        AND
        (t1.Feld2 = t2.Feld2)
        )
        OR
        (
        -- wähle Zeilen bei denen !(302 -> 301) und beide Felder stimmen überein
        (t1.Feld1 != 302 AND t2.Feld1 != 301)
        AND
        (t1.Feld1 = t2.Feld1 AND t1.Feld2 = t2.Feld2)
        )[/highlight]

        Comment


        • #5
          Originally posted by ebis View Post
          Wo ist da das Problem, ON statt WHERE und schon ist der JOIN fertig...
          ...
          Hats denn irgendwelche Vorteile? Ich denke das ganze ist Geschmackssache. Im Endeffekt wird die DB sowieso dasselbe ausführen.
          Natürlich verwende ich für JOINs über Foreign Keys auch die JOIN Syntax. Hier finde ich persönlich die über WHERE allerdings schöner.

          Comment


          • #6
            vielen Dank, aber hab woanders ne Antwort vorher bekommen.
            Na Klasse. Heimliches Crossposting ist nicht gerade ein Synonym guter Netiquette. Bitte in Zukunft nicht mehr machen.

            Comment


            • #7
              Na immerhin hat er ja oben die Lösung noch gepostet. Prickelnd find ichs trotzdem auch nicht.

              Comment


              • #8
                Hm, tut mir leid, aber ich verstehe das Problem nicht wirklich.

                Ist es nicht legitim an mehreren Stellen nachzufragen um Antworten zu bekommen? So bekommt man vllt auch verschiedene Lösungsansätze geboten. Ich habe dies ja hier in den Thread geschrieben und dazu noch, welche Lösung noch vorgeschlagen wurde.

                Comment


                • #9
                  Originally posted by KingOfDiamonds View Post
                  Hm, tut mir leid, aber ich verstehe das Problem nicht wirklich.
                  Du hast das Problem ja auch nicht! Für dich ist Multi- oder Crosspost per C&P ein sehr geringer Aufwand. Aber du beschäftigst in JEDEM Forum Leute damit, dir zu helfen OHNE das die voneinander wissen. Du bindest also Resourcen für dein Problem mehrfach! Das ist nicht nur hochgradig unfair und egoistisch anderen Nutzern gegenüber, sondern stellt auch die Kompetenz jedes einzelnen Forums in Frage (ich vertraue euren Antworten nicht, deshalb frage ich lieber noch woanders nach).
                  Aus diesen Gründen werden solche Crosspost von den Helfern in jedem Forum mit einem mehr oder weniger harten Bannstrahl getroffen. Wenn dich hier jemand erwischt, wird das Thema rigoros geschlossen! (Du hattest also ausgesprochenes Glück und solltest es nicht wieder strapazieren )

                  Originally posted by KingOfDiamonds View Post
                  Ist es nicht legitim an mehreren Stellen nachzufragen um Antworten zu bekommen?
                  Das ist durchaus legitim, vor allem bei Fragen die diskussionswürdig sind. Jedoch solltest du dann in JEDEM Forum VORAB kundtun, dass du diese Frage aus diesen und jenen Gründen in mehreren Foren stellst oder das du woanders nur unbefriedigende Antworten bekommen hast.

                  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