select mit left join zweier Tabellen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von druide.

    select mit left join zweier Tabellen

    Moin moin,

    in einer DB existieren zwei Tabelle:

    Tab1
    ID Sp1 Sp2 FremdID1 Sp3 FremdID2 Sp4 FremdID3 Sp5

    Tab2
    ID Name

    die Beziehung: Tab1.FremdID(1,2,3) = Tab2.ID

    Tabellen sind leider so vorgegeben.

    Bei meiner vorigen Version brauchte ich für die Darstellung im DGV nur jeweils eine FremdID-Spalte.
    Hat alles auch funktioniert.

    SQL-Abfrage

    1. "SELECT tab1.ID, tab1.Name, " & _
    2. "tab2.Name, tab1.[Attr_Min_1], " & _
    3. "From tab1 INNER JOIN tab2 ON tab1.[FremdID] = tab2.ID "


    Jetzt sollen aber mehr Daten angezeigt werden, somit müssen alle FremdID Spalten auftauchen.
    Zudem haben sich die Daten geändert:

    Datensätze FremdID1 > FremdID2 > FremdID3

    soll heißen, kann jetzt nicht mehr mit inner Join arbeiten.

    Mein Versuch ist jetzt:

    SQL-Abfrage

    1. "SELECT tab1.ID, tab1.Name, " & _
    2. "tab2.Name, tab1.[Attr_Min_1], " & _
    3. "tab2.Name, tab1.[Attr_Min_2], " & _
    4. "tab2.Name, tab1.[Attr_Min_3] " & _
    5. "From " & _
    6. "((((tab1 AS Ab1) INNER JOIN tab2 AS At1 ON Ab1.[Attribut1_ID] = At1.ID) " & _
    7. "LEFT JOIN tab2 AS At2 ON Ab1.[Attribut2_ID] = At2.ID)" & _
    8. "LEFT JOIN tab2 AS At3 ON Ab1.[Attribut3_ID] = At3.ID)"


    War nicht wirklich erfolgreich.
    Habe es sogar mit geschachtelten select´s versucht - ebenfalls nix.

    Ergebnis ist immer eine Fehlermeldung im "From-Teil" der select-Abfrage.

    Um es nochmal in Worte zu fassen:

    alle FremdID-Spalten aus Tabelle1 beziehen sich auf die id-Spalte von Tabell2.

    Bin mit meiner Weisheit am Ende.

    Tips sind sehr willkommen.

    Danke im Voraus

    Gruß Druide
    Um welche Datenbank handelt es sich denn?

    Bei ORACLE DB kannst Du folgendes machen. Ich glaube bei ein MYSQL DB sollte es auch funktionieren.

    Select * from
    tabellea,
    tabelleb,
    tabellec
    where
    tabellea.id = tabelleb.id(+) and
    tabelleb.idb = tabellec.idb(+) and
    Das ist alles ein bisschen verwirrend geschrieben..

    Du willst alle Daten aus Tabelle 1, deren ID in Tabelle2 vorkommt?

    Es wäre auch hilfreich wenn du nicht FremdID1 - x schreibst sondern richtige Namen und wenn das nicht geht wenigstens Pseudonyme..

    Ist das hier dein ursprüngliche Inner Join Versuch??

    SQL-Abfrage

    1. SELECT tab1.ID, tab1.Name, " & _
    2. "tab2.Name, tab1.[Attr_Min_1], " & _
    3. "tab2.Name, tab1.[Attr_Min_2], " & _
    4. "tab2.Name, tab1.[Attr_Min_3] " & _
    5. "From " & _
    6. "((((tab1 AS Ab1) INNER JOIN tab2 AS At1 ON Ab1.[Attribut1_ID] = At1.ID) " & _
    7. "LEFT JOIN tab2 AS At2 ON Ab1.[Attribut2_ID] = At2.ID)" & _
    8. "LEFT JOIN tab2 AS At3 ON Ab1.[Attribut3_ID] = At3.ID)





    Zudem haben sich die Daten geändert:
    Datensätze FremdID1 > FremdID2 > FremdID3

    Wurde aus FremdID1 FremdID2? oder wie?


    Das deute ich mal so,
    die Beziehung: Tab1.FremdID(1,2,3) = Tab2.ID

    das sich die ID aus Tabelle2 aus den 3 FremdID's aus Tabelle1 zusammensetzen, lieg ich da richtig?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „icemanns“ ()

    Hei,
    Danke für die schnellen Antworten.

    Ist mir etwas peinlich, habe gerade gesehen, war leider nicht die letzte Version meines Programms.

    Sorry, deshalb verwirrend.

    Es handelt sich um ACCESS 2003.

    Datensätze FremdID1 > FremdID2 > FremdID3
    sollte eigendlich nur heißen:

    z.B. FremdID1 alle Zeilen gefüllt
    FremdID2 vlt. 2/3 Zeilen gefüllt
    FremdID3 vlt. nur 1/3 Zeilen gefüllt.

    ==> es kann kein INNER JOIN mehr sein, sondern OUTER(LEFT/RIGHT) JOIN

    Werde gleich mal meine aktuelle Version posten.

    Gruß Druide
    hallo,

    hier meine altuelle Version:

    SQL-Abfrage

    1. SELECT tab1.ID, tab1.Name, " & _
    2. "At1.Name, Ab1.[Attr_Min_1], " & _
    3. "At2.Name, Ab1.[Attr_Min_2], " & _
    4. "At3.Name, Ab1.[Attr_Min_3] " & _
    5. "From " & _
    6. "((((tab1 AS Ab1) INNER JOIN tab2 AS At1 ON Ab1.[Attribut1_ID] = At1.ID) " & _
    7. "LEFT JOIN tab2 AS At2 ON Ab1.[Attribut2_ID] = At2.ID)" & _
    8. "LEFT JOIN tab2 AS At3 ON Ab1.[Attribut3_ID] = At3.ID)



    Die Fehlermeldung lautet jetzt:

    "VerknüpfungsAusdruck nicht unterstützt"

    Damit keine Fehler entstehen:

    die FremdID´s 1 + 2 + 3 sind jeweils eine Spalte der tab1.

    Jede dieser Spalten hat getrennt gesehen einen Bezug zu nur einer Spalte der tab2, die tab2.ID

    tab1.[Attribut1_ID] = tab2.ID
    tab1.[Attribut2_ID] = tab2.ID
    tab1.[Attribut3_ID] = tab2.ID

    Würden sich nicht alle nur auf eine einzige Spalte der Tabelle 2 beziehen, hätte ich kein Problem.

    auch die Aliassess :sleeping: haben nicht geholfen.

    Nur hierfür finde ich keine Lösung.

    Gruß Druide
    Hallo icemanns

    1.)
    aus einigen Beiträgen und Büchern habe ich erfahren, bei Access sind manchmal Klammern für die join´s nötig.

    Habe sie auch nur, hätte ja damit klappen können.

    Die eckigen Klammern mache ich immer bei "unsauberen" Spalten-Beschriftungen.

    2.)
    Eigentlich will ich nur die Daten aus einer Tabelle z.B. tab1.

    Da hier aber mehrere Spalten nur Keys enthalten und ich aber die dahinterliegenden Daten benötige,
    muß ich über die vorhandenen Beziehungen auf diese Daten zugreifen.

    tab1.[Attribut1_ID] = tab2.ID
    tab1.[Attribut2_ID] = tab2.ID
    tab1.[Attribut3_ID] = tab2.ID

    Hier ist aber mein Problem, denn leider beziehen sich alle Schlüsselspalten aus tab1 nur auf eine einzige Spalte der Tabelle tab2, natürlich hier auf die ID.

    Für jeweils nur eine Key-Spalte aus tab1 zum weiteren Bearbeiten/Anzeigen habe ich kein Problem, kriege alles Daten die ich benötige und alles ok.

    Nur jetzt muß das System erweitert werden und ich versuche drei Einzelabfragen in eine einzige Abfrage zu packen.

    Ist auch für die weitere Bearbeitung sinnvoll, da ich dann auch nur eine einzige Datatable usw. benötige, und nicht dann nochmal mit mehreren Tabellen hantieren muß.

    Vielleicht klappt es ja doch noch.

    Vielleicht habe ich Dich ja auch mit meinem Schrott-Code am Anfang so irritiert, daß Du gleich Feierabend machen mußt. :thumbup:

    Gruß Druide
    Wie wäre es mit OR ?

    SELECT * FROM tab1
    INNER JOIN tab2
    ON tab1.id1 = tab2.id
    OR tab1.id2 = tab2.id
    OR tab1.id3 = tab2.id


    Vorausgesetzt ich habe verstanden was du willst ^^
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo Mono,

    Das ist leider nicht die Lösung.

    In den Schlüsselspalten der Tabelle tab1 habe ich ja nur Zahlenwerte vorliegen.

    Über die Verknüpfung zu einer anderen Tabelle tab2 will ich ja beim Einlesen der Daten keine Zahlen vorfinden,
    sondern die Werte, die sich hinter den Zahlen verbergen.

    Dein Select-Therm läuft zwar, aber ich erhalte nur die Key´s in der entsprechenden Spalte, nicht die Beziehungs-Daten aus der zweiten Tabelletab2.

    Danke trotzdem :) :)

    Gruß Druide
    Ich komm immer mehr drauf du hast ein Problem mit deiner Datenbankstruktur oder ein Grundlagenproblem ;)

    Du kannst bei Mono's SELECT einfach anstatt * die nötigen Spalten aus der Tabelle2 einfügen..

    Oder wir checken alle nicht was du uns sagen willst :(
    Hallo,

    leider war ich eine lange Zeit nicht in der Lage, hier das Thema zu beenden.

    Falls es noch jemanden interessiert, hier jetzt die Lösung:

    Quellcode

    1. Dim SQL_Text As String =
    2. "SELECT tab1.Name, tab2.[Lern-Punkte],
    3. tab3.Name AS Haupt_Attr_Name, tab1.Hauptatt_Min,
    4. tab3.Name AS Neben_Attr_name, tab1.Nebenattr_Min,
    5. tab1.Startwert, tab1.Lernwert, tab1.Maxwert, tab1.Vorbedingung_ID
    6. FROM (((tab2 INNER JOIN tab1 ON tab2.Fertigkeiten_ID = tab1.ID)
    7. LEFT OUTER JOIN tab3 ON tab1.Nebenattr_ID = tab3.ID)
    8. LEFT OUTER JOIN tab3 tab3 ON tab1.Hauptatt_ID = tab3.ID)
    9. WHERE tab2.Abenteurer_ID ="


    Nochmals Danke an alle
    Gruß druide