IB: SQL Abfrage mit zwei Artikelnummern

Hallo,

ich habe hier eine SQL Abfrage:

SELECT a.Artikelnummer, a.Bezeichnung, zu.ZugeordneterArtikel 
FROM Artikel a

INNER JOIN ZugeordneteArtikel zu
ON zu.Artikelnummer = a.ArtikelNummer


WHERE a.Bezeichnung like '%(BSD)'

Er listet mir nun die Artikelnummer und die Artikelbeschreibung sowie weitere Artikelnummern die dem Artikel zugeordnet sind auf. Ich möchte nun, dass er hinter den ZugeorndetenArtikel ebenfalls noch die Artikelbeschreibung des Zugeorndeten Artikels anzeigt. Ich bekomme es nicht hin. Wie muss ich hier vorgehen?

Danke

  1. Tach!

    Ich möchte nun, dass er hinter den ZugeorndetenArtikel ebenfalls noch die Artikelbeschreibung des Zugeorndeten Artikels anzeigt. Ich bekomme es nicht hin. Wie muss ich hier vorgehen?

    Noch einen Join auf die Artikeltabelle mit separatem Alias anhängen, vielleicht einen Left Join. Aber zu viel Joinen macht die Sache nicht gerade übersichtlicher. Besser finde ich, mit einer Correlated Subquery auf die Artikeltabelle die Beschreibung zu holen. Zumindest, wenn das das einzige gewünschte Feld ist. Bei mehr als einem Feld ist dann doch wieder der Join einfacher zu pflegen.

    dedlfix.

    1. Tach!

      Ich möchte nun, dass er hinter den ZugeorndetenArtikel ebenfalls noch die Artikelbeschreibung des Zugeorndeten Artikels anzeigt. Ich bekomme es nicht hin. Wie muss ich hier vorgehen?

      Noch einen Join auf die Artikeltabelle mit separatem Alias anhängen, vielleicht einen Left Join. Aber zu viel Joinen macht die Sache nicht gerade übersichtlicher. Besser finde ich, mit einer Correlated Subquery auf die Artikeltabelle die Beschreibung zu holen. Zumindest, wenn das das einzige gewünschte Feld ist. Bei mehr als einem Feld ist dann doch wieder der Join einfacher zu pflegen.

      dedlfix.

      kannst Du mir dafür ein Beispiel geben? Es ist zwar logisch aber für micht nicht verständlich :-)

      Wäre super.

      Danke

      1. Tach!

        kannst Du mir dafür ein Beispiel geben? Es ist zwar logisch aber für micht nicht verständlich :-)

        Du schreibst zunächst die Subquery so, dass sie den gewünschten einzelnen Wert für eine per Hand festgelegte Bedingung liefert. Also in deinem Fall, wenn die Hauptquery theoretisch herausgefunden hat, dass der Zusatzartikel x gewünscht ist, wäre die Bedingung WHERE Artikelnummer = x. Diese Subquery kannst du auch einfach so testen, dass sie das gewünschte Verhalten zeigt. Ist das der Fall, baust du sie anstelle eines Feldes im SELECT-Teil deiner eigentlichen Query ein und ersetzt in der Bedingung den festen Wert durch einen Verweis auf ein Feld der Hauptquery. Das ist der korrelierende Teil an der Geschichte, die Hauptquery stellt den Wert für die Bedingung in der Subquery.

        Nachfolgend das Prinzip, das du an deine Verhältnisse anpassen musst.

        SELECT foo, bar, (SELECT qux FROM table2 WHERE foo = t1.foo) qux FROM table1 t1 WHERE ...
        

        Subquerys auch in der correlated Variante sind auch im MySQL-Handbuch (oder in dem deines Systems) beschrieben.

        dedlfix.

        1. PERFEKT, ich kämpfe schon oft mit diesem Thema! Und nun ist es doch so einfach!!! VIELEN HERZLICHEN DANK

          [Vollzitat entfernt]

          1. "LEFT JOIN" ist ein Outer-Join. Den braucht man tatsächlich, um auch die Artikel zu bekommen, die keine zugeordneten Artikel haben, der muss bereits in die erste Query von bleumi hinein.

            Die These, dass viele Joins unübersichtlich sind, ist umstritten. Ich finde Subselects deutlich schwieriger zu lesen und sobald man aus einer Tabelle mehr als eine Spalte dazu holen will, sind sie auch nicht mehr sinnvoll.

            Ich hoffe, dass ich mich hier mit LEFT/INNER JOIN nicht verhauen habe. Eigentlich müsste ich es ausprobieren...

            SELECT a.Artikelnummer, a.Bezeichnung, azu.Artikelnummer, azu.Bezeichnung
            FROM Artikel a
                 LEFT JOIN ZugeordneteArtikel zu ON zu.Artikelnummer = a.ArtikelNummer
                 INNER JOIN Artikel azu ON zu.ZugeordneterArtikel = azu.ArtikelNummer
            
            WHERE a.Bezeichnung like '%(BSD)'
            

            Rolf

            1. funktioniert auch :-)

              [Vollzitat entfernt]