2 Tabellen mit SQL verknüpfen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Holistiker.

    2 Tabellen mit SQL verknüpfen

    Hallo liebes Paradise Team, :)

    ich arbeite aktuell an einer SQL Abfrage die mir den letzten Nerv raubt, da ich keine Ahnung habe wie ich das Vernünftig lösen soll.

    Ich versuche die Situation mal zu schildern:

    Gegeben sind 2 Tabellen:
    tbl_bw_art (Artikelstammdaten)
    tbl_bw_ada (Adress/Artikel Stammdaten -> Hier stehen Preise bzw. Konditionen für die Artikel aus tbl_bw_art drin, basierend auf Adressnummern)

    tbl_bw_art sieht so aus:
    Artikelnummer (Pi)Lieferant1Lieferant2Lieferant3
    102640732010738510702850
    103050738510732010702850
    102960732010




    tbl_bw_ada sieht so aus:
    id (Pi)AdressnummerArtikelnummerPreis
    732010.102640732010102640500
    732010.103050732010103050400
    738510.102640738510102640200
    738510.103050738510103050700


    Es muss nicht zwangsläufig für jeden Artikel in tbl_bw_art ein Datensatz in tbl_bw_ada vorkommen.
    Die Ausgangstabelle die ich gerne hätte soll so aussehen:

    ArtikelnummerLieferant1Preis Lieferant1Lieferant2Preis Lieferant2Lieferant3Preis Lieferant3
    102640732010500738510200702850
    103050738510700732010400702850
    102690732010





    (In jedem Fall muss also die tbl_bw_art komplett ausgegeben werden, egal ob ein Preis in tbl_bw_ada gefunden wurde oder nicht -> Also Left Join)

    Ich hoffe der Aufbau ist verständlich genug :)

    Leider endet hier auch schon meine Kenntnis. Ich habe keine Ahnung wie ich mir diese Ausgangstabelle zusammenbauen könnte.
    Klar ist das ich ein "Left join" nehmen muss, damit ich auf jeden Fall alle Artikel in der Ausgangstabelle angezeigt bekomme aber ich weiss partou nicht wie ich den Left Join aufbauen muss.
    Geschweige denn wie ich die zusätzlichen Spalten für die Preise kreieren kann!? Temporäre SQL Tabelle!?

    Klar könnte ich jetzt beide Tabellen in eine Datatable laden und von dort über eine Schleife alle Datensätze so verknüpfen wie ich sie bräuchte aber am ende stehen in der tbl_bw_art ca. 40000 Datensätze drin und in der tbl_bw_ada ca. 200000.
    Da würde eine Schleife viel zu lange dauern und das wäre total unelegant. Zumal ich das ganze am Ende noch mit einer Suche verknüpfen muss :thumbsup: .

    Deshalb wollte ich die Abfrage und die Zusammensetzung der Tabelle am besten direkt über eine SQL-Abfrage lösen (Mysql).

    Eventuell kann mir ja jemand von den Experten hier helfen :)

    Vielen Dank schonmal
    Das Datenmodell scheint mir ungeeignet.
    In einer Datenbank kann man seine Daten nicht so organisieren, dass Lieferanten in der Spalte aufgetragen werden, und Artikel in Zeilen.
    Wenn das bei dir bereits unkorrigierbar passiert ist, ist eben Pech - ich zumindest wüsste kein Sql-Statement, was aus den gegebnenen Tabellen dein Wunsch-Ergebnis zusammensucht.
    Ich denke wir sind uns einig dass das Datenmodell nicht für eine relationale Datenbank geeignet ist. Eine "dynamische" SQL-Abfrage (also falls z.B. noch mehr Lieferanten hinzu kommen), ist hier nicht möglich.
    Eine SQL-Abfrage für dein Vorhaben könnte allerdings so aussehen (mit festen Spaltennamen "Lieferant1" etc.):

    SQL-Abfrage

    1. SELECT art.Artikelnummer, art.Lieferant1, ada1.Preis AS `Preis Lieferant1`, art.Lieferant2, ada2.Preis AS `Preis Lieferant2`, art.Lieferant3, ada3.Preis AS `Preis Lieferant3`
    2. FROM tbl_bw_art art
    3. LEFT JOIN tbl_bw_ada ada1 ON ada1.Artikelnummer = art.Artikelnummer AND ada1.Adressnummer = art.Lieferant1
    4. LEFT JOIN tbl_bw_ada ada2 ON ada2.Artikelnummer = art.Artikelnummer AND ada2.Adressnummer = art.Lieferant2
    5. LEFT JOIN tbl_bw_ada ada3 ON ada3.Artikelnummer = art.Artikelnummer AND ada3.Adressnummer = art.Lieferant3
    Danke schonmal fürs Feedback.
    Man sollte vielleicht folgendes dazu sagen:

    Lieferant1,2 und 3 sind fest hinterlegt und dienen als Hauptlieferant,Nebenlieferant,Nebenlieferant. Da kommen keine neue Spalten hinzu bei 3 ist ende.
    Heisst also einem Artikel können maximal 3 Lieferanten zugeordnet werden ( Danke an den ERP-Entwickler <X ).

    Habe jetzt mal folgendes gemacht (Zum testen für zumindest schon mal den ersten Lieferanten):

    SQL-Abfrage

    1. CREATE TEMPORARY TABLE Artikelstamm (Artikelnummer VARCHAR(25),Lieferant1 INT(8),PreisL1 DECIMAL(6,2))




    Damit habe ich ja schonmal die Tabelle angelegt so wie sie aussehen soll (die anderen Lieferanten 2 und 3 kann man ja nach belieben ergänzen)

    Mit

    SQL-Abfrage

    1. INSERT INTO Artikelstamm(Artikelnummer,Lieferant1) SELECT Artikelnummer,Lieferant1 FROM tbl_bw_art


    habe ich schonmal die Artikelnummer und den Lieferant1 + eine Spalte für den PreisL1 in der Tabelle.

    Jetzt müsste ich ja nurnoch irgendwie die Preise aus der tbl_bw_ada rauskitzeln.

    Irgendwie sowas wie:

    SQL-Abfrage

    1. INSERT INTO Artikelstamm(PreisL1) SELECT Preis FROM tbl_bw_ada WHERE Artikelnummer=Artikelstamm.Artikelnummer AND Adressnummer=Artikelstamm.Lieferant1


    Aber das geht natürlich nicht :huh:

    //Da habe ich wohl länge geschrieben und die Antwort erst nach dem Absenden gesehen. Ich check das mal

    Yannici schrieb:

    Ich denke wir sind uns einig dass das Datenmodell nicht für eine relationale Datenbank geeignet ist. Eine "dynamische" SQL-Abfrage (also falls z.B. noch mehr Lieferanten hinzu kommen), ist hier nicht möglich.
    Eine SQL-Abfrage für dein Vorhaben könnte allerdings so aussehen (mit festen Spaltennamen "Lieferant1" etc.):

    SQL-Abfrage

    1. SELECT art.Artikelnummer, art.Lieferant1, ada1.Preis AS `Preis Lieferant1`, art.Lieferant2, ada2.Preis AS `Preis Lieferant2`, art.Lieferant3, ada3.Preis AS `Preis Lieferant3`
    2. FROM tbl_bw_art art
    3. LEFT JOIN tbl_bw_ada ada1 ON ada1.Artikelnummer = art.Artikelnummer AND ada1.Adressnummer = art.Lieferant1
    4. LEFT JOIN tbl_bw_ada ada2 ON ada2.Artikelnummer = art.Artikelnummer AND ada2.Adressnummer = art.Lieferant2
    5. LEFT JOIN tbl_bw_ada ada3 ON ada3.Artikelnummer = art.Artikelnummer AND ada3.Adressnummer = art.Lieferant3



    Habe das jetzt mal getestet und ich glaube das Funktioniert leider nicht.
    Musste das Timeout für den Dataadapter erstmal volle Kanne hochschrauben um zu schauen ob es überhaupt funktioniert und jetzt nach 4 Minuten habe ich dann doch lieber abgebrochen.

    Hmm :/

    //Edit grundsätzlich scheint das wohl zu funktionieren. Habe jetzt mal eine Where Klausel drüber gelegt und bekomme dann auch ein Ergebnis aber schön schnell ist das leider nicht.
    Nicht falsch verstehen, ich bin wirklich dankbar überhaupt schonmal etwas funktionierendes zu haben aber Produktiv ist die Lösung leider noch nicht.
    Jetzt hab ichs :)

    Habe den Index (id aus tbl_bw_ada welcher sich aus "Lieferant"."Adressnummer" zusammen setzt) einfach direkt in der Abfrage gebildet dadurch ist das ganze wieder richtig schön schnell :)

    SQL-Abfrage

    1. Select art.Artikelnummer, art.Lieferant1, ada1.Preis1 AS `Preis Lieferant1`, art.Lieferant2, ada2.Preis1 AS `Preis Lieferant2`, art.Lieferant3, ada3.Preis1 AS `Preis Lieferant3`
    2. From tbl_bw_art as art
    3. LEFT JOIN tbl_bw_ada as ada1 ON CONCAT(art.Lieferant1,'.',art.Artikelnummer) = ada1.id
    4. LEFT JOIN tbl_bw_ada as ada2 ON CONCAT(art.Lieferant2,'.',art.Artikelnummer) = ada2.id
    5. LEFT JOIN tbl_bw_ada as ada3 ON CONCAT(art.Lieferant3,'.',art.Artikelnummer) = ada3.id


    Vielen Dank für den genialen Denkanstoß, jetzt weiss ich auch zukünftig wie ich mir noch aus anderen Tabellen Daten dazuholen kann :)
    Klar, wenn die Fremdschlüssel (Adressnummer und Artikelnummer) keinen Index haben, dann wird das ganze bei großer Datenmenge schon sehr langsam. Die zwei Schlüssel als String-Verbindung sind natürlich keine optimale Lösung in einer Datenbank, besser wäre
    auf die zwei Fremdschlüsselspalten einen Index zu setzen. Wenn es für dich aber funktioniert, freut mich dass ich helfen konnte :)
    Danke für den Ratschlag aber in diesem Fall kann ich an dem Datenmodell leider nichts ändern, da ich mich hier an die Gegebenheiten halten muss.

    Dass das Datenmodell mist ist und hier sämtliche Regeln der Relationalen Datenbanken missachtet werden, weiss ich auch :) Hatte Datenbanken vor 10 Jahren selber ausgiebig in der Schule ;)
    Kann da aber leider nichts dran ändern in diesem Fall.

    Trotzdem aber danke an alle für die Hilfe :)