SQL Abfrage über zwei Tabellen (Artikel und Lieferant)

  • Allgemein

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Vatter.

    SQL Abfrage über zwei Tabellen (Artikel und Lieferant)

    Hi,

    ich habe gerade mal wieder ein kleines Denk-Anstoß-Problem.

    Ich habe zwei Tabellen:
    1. S_Artikel mit den Daten zum Artikel (Teilegruppe, Artikelnummer, Bezeichnung und und und)
    2. E_ArtLief mit den Daten der Lieferanten eines Artikels (sprich pro Artikelnummer die Angabe der Lieferantennummer, ob es der Hauptlieferant ist usw.)

    Nun möchte ich alle Artikel mit der Artikelgruppe
    ArtA, welche als Hauptlieferant LiefA haben UND als zusätzlichen Lieferanten LiefB haben, sowie zu
    ArtB, welche als Hauptlieferant LiefB haben UND als zusätzlichen Lieferanten LiefC haben.

    Problem ist, dass ja pro Artikel-Lieferant-Beziehnung ein Datensatz vorhanden ist. (was irgendwie ja Sinn macht^^)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ave Mike.

    Ja, ich kenne joins ^^
    Mir geht es aber wie gesagt gerade um diese genannte Konstellation, nicht darum zwei Tabellen zu joinen. Das ist hier ja wohl eher Kinderkaka :P

    Wie kriege ich den Join so begrenzt, dass er mir nur die gewünschten zwei Artikel mit den jeweils zugehörigen Lieferanten auswirft.
    Ich möchte NICHT sehen, wenn ArtA den Lieferanten LiefC oder LiefD usw. hat, sondern nur die Lieferanten LiefA und LiefB und wenn nicht, dann sollten die Felder mit Null gefüllt sein (Left Join um auf deinen Post zurück zu kommen ;))
    Gleiches gilt für ArtB hier will ich nicht sehen ob der LiefA zufällig einen der Artikel liefert, sondern nur LiefB und LiefC.

    Hoffe das war besser beschrieben, was ich eigentlich möchte, bzw. woran es hapert.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ich verstehe das Problem nicht ganz :(
    Für was gibt es den WHERE und "ON" Teil in denen du jeweils Kritieren aufzeigen kannst anhand deren gejoint bzw gefiltert werden kann?

    SQL-Abfrage

    1. SELECT ....
    2. FROM ...
    3. LEFT JOIN ...
    4. ON artikelnummer = artikelnummer
    5. WHERE Lieferant = ... and Lieferant_zusaetzlich = ....



    Wenn du es genau willst, dann musst auch die Datenbank bisschen besser erklären, weil sowie du das hier beschrieben hast ist das leicht verwirrend.
    Es gibt doch sicher ein ER-Modell dazu, hier von ein Screen ist immer sehr hilfreich. Oder eine Übersicht der Tabellen mit den Attributen.
    Das du vielleicht suchen, ansonsten du Code auf Server senden mußt

    VB.NET-Quellcode

    1. dim zweitetabelle as boolean = false
    2. sql_string = ""
    3. sql_string += "select * FROM S_Artikel"
    4. sql_string += "where "
    5. sql_string += "S_Artikel.Bezeichnung like '%" + txt_suche.Text & "%'"
    6. If zweitetabelle = true Then
    7. sql_string += "and S_Artikel.Artikelnummer in "
    8. sql_string += "(select E_ArtLief.Artikelnummer from E_ArtLief"
    9. sql_string += " where Lieferantennummer like '%" + txt_suche.Text & "%'"
    10. end if
    Moin,

    ich befinde mich hier ausschließlich in SQL und nicht in einem Programm ;)

    Es wäre schön, wenn ich ein Lieferant_zusaetzlich hätte. Aber das habe ich ja nicht, denn wie schon geschrieben sind in der Tabelle PRO Lieferant und PRO Artikel genau EIN Satz angelegt.
    Das heißt, ein Artikel wird von 5 Lieferanten geliefert, dann hab ich 5 Datensätze. Und da ist mein Problem dort die zwei Richtigen heraus zu bekommen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    moin,

    nein das kann ich nicht ;) Die Logik der Datenbank ist ja auch entsprechend der Normalformen korrekt ^^

    Ich hatte auch schon an Subselects gedacht, aber das würde m.E. nur funktionieren wenn ich einen Parameter (die Artikelnummer) mit in den SubSelect übergeben könnte und dann entsprechend prüfen könnte, ob der Count der Lieferanten entsprechend der WHERE Bedingung als 2 übergeben wird. Aber ich wüsste nicht wie man die Artikelnummer mit in den Subselect übergeben würde.

    Habe es nun über ne Pivot-Tabelle gelöst... Aber wüsste trotzdem noch gern ob das nicht auch gescheit machbar ist
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Also bei MS-SQL kann man das machen.


    SQL-Abfrage

    1. select
    2. AVG(tage)
    3. from (
    4. select a.aid, a.antragsdatum, b.bearbdatum, DATEDIFF(day,a.antragsdatum,b.bearbdatum)as tage from Antrag a
    5. inner join Antrag b
    6. on a.aid = b.aid
    7. and a.status = 0
    8. and b.status = 3
    9. where a.aid = ( select aid from Antrag where aid_status = 0 and status = 1 and aid = a.aid )
    10. and b.bearbdatum = ( select max(bearbdatum) from Antrag where aid = b.aid and status = 3 )
    11. and a.bearbdatum is null
    12. ) x

    MemoAnMichSelbst schrieb:

    Die Logik der Datenbank ist ja auch entsprechend der Normalformen korrekt

    auch ein normalform-konformes Datenmodell kann falsch sein.

    Wie sind die Relationen der Tabellen Art und Lief festgelegt?
    Gibt ja nur 2 Möglichkeiten:
    Art->Lief oder Lief->Art

    letzteres wäre vmtl. falsch, vlt. ist auch beides falsch, und richtig wäre, eine m:n - Relation zu modellieren (immerhing kanns mehrere Lieferanten eines Artikels geben).
    Für eine m:n - Relation fehlt aber die Mittler-Tabelle, oder du hast versäumt, sie anzugeben.
    Korrekt.

    Es gibt eine Tabelle für Lieferanten, eine für Artikel und die besagte E_ArtLief ist die m:n Tabelle.
    Deshalb gibt es für jede Lieferant-Artikel Kombination jeweils einen Datensatz.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Jut, eine m:n also:
    Art->ArtLief<-Lief

    MemoAnMichSelbst schrieb:

    Nun möchte ich alle Artikel mit der Artikelgruppe
    ArtA, welche als Hauptlieferant LiefA haben UND als zusätzlichen Lieferanten LiefB haben, sowie zu
    ArtB, welche als Hauptlieferant LiefB haben UND als zusätzlichen Lieferanten LiefC haben.
    was ist nun eine Artikelgruppe?

    Auch verstehe ich deine Anforderung nicht: Was sind die Inputs? bestimmte Lieferanten? bestimmte Artikel?

    oder gar kein Input? (wäre theoretisch auch möglich, dass man ein Artikel-konglomerat sucht, bei dem Haupt- und Neben-Lieferant iwie so komische Bedingungen erfüllen)
    Also nun ganz ausgeholt. ;)
    Es gibt eine Lieferantentabelle in der anhand der Lieferantennumer die Daten zum Lieferanten hinterlegt sind. Diese interessiert in meinem Problemfall nicht, da ich die DREI Lieferantennummern ja kenne, welche ich benötige.

    Dann gibt es eine Artikeltabelle in der alle Informationen zu den Artikeln stehen (Artikelnummer, Rabattgruppe, Bezeichnung, Lagerorte, Artikelgruppe, Kostenstelle usw.)

    Dann gibt es die E_ArtLief welche die Lieferanten mit den Artikeln verknüpft. Hier steht wenig... Artikelnummer, Lieferantennummer, Kennung-Hauptlieferant(Ja, Nein), Änderungsdatum usw.

    Eine Artikelgruppe ist nun ja... ne Gruppe von Artikeln... Alphanumerische Kennung.

    Simples Beispiel:
    Schrauben wäre ne Artikelgruppe (jede Länge, Dicke usw. ein eigener Artikel)

    Nun habe ich in meinem Fall zwei Artikelgruppen und drei Lieferanten die mich interessieren.
    Die Lieferanten LiefA, LiefB, LiefC
    und die Artikelgruppen ArtA und ArtB.

    Nun möchte ich aus den Tabellen alle Artikel ArtA wissen, welche als Lieferant sowohl LiefA, als auch LiefB haben UND
    alle Artikel ArtB, welche als Lieferant sowohl LiefB, als auch LiefC haben.

    Also benötige ich die Artikel-Tabelle um anhand der Artikelgruppe die entsprechenden Artikelnummern zu finden, welche ich mit E_ArtLief verknüpfen kann. In dieser stehen nun die jeweiligen Lieferanten. Und ich möchte nun erstmal nur Artikel sehen, welche jeweils zwei der drei Lieferanten zugeordnet haben (bei ArtA die Lieferanten LiefA und LiefB und bei ArtB die Lieferanten LiefB und LiefC).

    Das wäre der erste Schritt den ich so bräuchte.
    Natürlich wäre es schön zu wissen, welche Artikel nur einen der beiden Lieferanten haben, da dort noch eine Teile-Lieferanten-Beziehung angelegt werden müsste, aber das wäre eher das I-Tüpfelchen;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    nun, das macht mich schon bischen unwillig, wennich hier über 10 posts benötige, um einem ausgewiesenen Datenbänker (halte dich jdfs. dafür) das für seine Frage notwendige Datenmodell aus der Nase zu ziehen:
    ArtGroup->Art->ArtLief<-Lief

    MemoAnMichSelbst schrieb:

    Nun habe ich in meinem Fall zwei Artikelgruppen und drei Lieferanten die mich interessieren.
    Die Lieferanten LiefA, LiefB, LiefC, und die Artikelgruppen ArtA und ArtB.

    Nun möchte ich aus den Tabellen alle Artikel ArtA wissen, welche als Lieferant sowohl LiefA, als auch LiefB haben UND
    alle Artikel ArtB, welche als Lieferant sowohl LiefB, als auch LiefC haben.

    Das sind eiglich 2 Abfragen - würdich im ersten Schritt erstmal trennen:

    SQL-Abfrage

    1. select * from Artikel As a Where a.ArtGroup=@ArtA And (a.Lief=@LiefA or a.Lief=@LiefB)
    Das gleiche kannste auch für die ArtB-Gruppe hinschreiben, und dann die Selects mit Union vereinen

    ist natürlich komplizierter (weil Sql is Crap): Es gibt ja kein direktes Artikel.Lief, sondern man musses ja erst durchn InnerJoin ermitteln:

    SQL-Abfrage

    1. (select a.*, al.LiefID from Artikel As a Where a.ArtGroup=@ArtA) inner join ArtLief as al on (a.ID=al.ArtID and (al.LiefID=@LiefA or al.LiefID=@LiefB))
    (Dassis nur Pseudo-Sql, ich vermute, die Where-Klausel muß man anders verlegen)
    Okay,

    tut mir leid, wenn man so in seinen eigenen Gedanken ist und alles erstmal für selbstverständlich hält, ist es manchmal garnicht so leicht die Frage so zu stellen, dass andere sie auch so einleuchtend finden, wie man selbst ^^

    Hier habe ich nur ein Problem und zwar, durch diese Art der Verknüpfung, kriege ich leider nicht mit, ob nur einer der zwei Lieferanten vorhanden ist und das ist ja das Wichtige an der Geschichte.

    SQL-Abfrage

    1. a.ArtGroup=@ArtA And (a.Lief=@LiefA or a.Lief=@LiefB)
    wirft mir ja entweder oder aus.
    Und der AND Operator ist nicht brauchbar, da es pro Beziehung einen eigenen Datensatz gibt. Und genau da ist mein Problemchen ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    jo, wie gesagt: Pseudo-Sql.
    Deine wirkliche Anforderung ist komplizierter, da muß vmtl. auch noch die Lieferanten-Tabelle drangejoint werden, wenn du von den Lieferanten noch weitere Info haben willst als nur die ID.
    Und die spezifizierung, ob HauptLieferant habich auch weggelassen
    Das ist ja alles kein Problem.

    Mein eigentliches Problem ist ja, wie kriege ich den Schmarn so gefiltert, dass er mir immer die zwei zugehörigen Lieferanten zum Artikel anzeigt.
    Wenn an einem Artikel nur einer der zwei gewünschten Lieferanten hängt, interessiert dieser mich nicht, bzw nur im Rahmen einer Späteren Auswertung betreffend fehlender Lieferanten.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D