none
SQL SERVER Abfrage RRS feed

  • Frage

  • Hallo
    Möchte 2 tabelle mehfach miteinander zu verbinden
    ---
    TAB1
     KopfID ZeileID
        A           1
        A           2
        2           1
        2           A
    -----------
    Ergebnis von der Abfrage wenn ich den Kopfid 2 suche soll so sein: die Kopfid A wird auch ausgegeben weil er in der zeileID von 2 vorhanden ist
    -----------
        2         1
        2         A
        A         1
        A         2

    kann mir jemand helfen
    Gruß

    Marcelo
    Donnerstag, 22. Oktober 2009 10:59

Antworten

  • Ok, Du hast also einen Stücklistenartikel und willst neben diese, Artikel auch alle Bestandteile ausgegeben haben.

    Dir reicht es aber Einstufig? Eben Dein letztes Beispiel, da ist ein Teil der Stückliste der Artikel 4712, der wiederum eine Stückliste ist.
    Das liesse sich in Grenzen auch lösen, über eine rekursive Common Table Expression (CTE).

    Nur einstufig ist es einfach über einen Self-Join verbunden mit einem UNION lösbar:

    CREATE TABLE #tab1

        (KopfID char(1), ZeileID char(1))

    INSERT INTO #tab1 VALUES('A', '1');

    INSERT INTO #tab1 VALUES('A', '2');

    INSERT INTO #tab1 VALUES('2', '1');

    INSERT INTO #tab1 VALUES('2', 'A');

     

    SELECT KopfID, ZeileID

    FROM #tab1

    WHERE KopfID = '2'

     

    UNION ALL

     

    SELECT Part.KopfId, Part.ZeileID

    FROM #tab1 AS Main

         INNER JOIN

         #tab1 AS Part

             ON Main.ZeileId = Part.KopfID

    WHERE Main.KopfID = '2'

     

    GO

    DROP TABLE #tab1

     

     

    KopfID ZeileID

    ------ -------

    2      1

    2      A

    A      1

    A      2

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 22. Oktober 2009 13:08

Alle Antworten

  • Hallo Marcelo,

    Dein Wunsch-Ergebnis passt nicht so ganz zur Beschreibung, deswegen eine kurze Nachfrage: Warum wird/soll die Zeile "A 1" mit ausgegeben?

    Ansonsten, wenn die Logik ist "KopfID = 2 oder ZeileID = 2":

    CREATE TABLE #tab1

        (KopfID char(1), ZeileID char(1))

    INSERT INTO #tab1 VALUES('A', '1');

    INSERT INTO #tab1 VALUES('A', '2');

    INSERT INTO #tab1 VALUES('2', '1');

    INSERT INTO #tab1 VALUES('2', 'A');

     

    SELECT *

    FROM #tab1

    WHERE KopfID = '2'

          OR ZeileID = '2'

     

    GO

    DROP TABLE #tab1



    KopfID ZeileID

    ------ -------

    A      2

    2      1

    2      A



    Oder soll "A 2" nur dann ausgegeben werden, wenn mindest es ein "2 ?" existiert?
    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 22. Oktober 2009 11:14
  • Hallo

    versuche zu erklären:

    wenn die zeileID ein kopfID enthält muss die vollständig ausgegeben werden.

    artikel 4711 besteht aus artikel 4710 und 4709
    artikel 4712 besteht aus artikel 5000 und 4711

    wenn ich alle komponenten zu artikel 4712 auflisten möchte muss ich auch 4710 und 4709 dabei haben.

    und so kann es auch  ein artikel geben : 4713 besteht aus Artikel 3333 und 4711 und 4712

    vielendank

    gruß

    marcelo
    Donnerstag, 22. Oktober 2009 11:56
  • Ok, Du hast also einen Stücklistenartikel und willst neben diese, Artikel auch alle Bestandteile ausgegeben haben.

    Dir reicht es aber Einstufig? Eben Dein letztes Beispiel, da ist ein Teil der Stückliste der Artikel 4712, der wiederum eine Stückliste ist.
    Das liesse sich in Grenzen auch lösen, über eine rekursive Common Table Expression (CTE).

    Nur einstufig ist es einfach über einen Self-Join verbunden mit einem UNION lösbar:

    CREATE TABLE #tab1

        (KopfID char(1), ZeileID char(1))

    INSERT INTO #tab1 VALUES('A', '1');

    INSERT INTO #tab1 VALUES('A', '2');

    INSERT INTO #tab1 VALUES('2', '1');

    INSERT INTO #tab1 VALUES('2', 'A');

     

    SELECT KopfID, ZeileID

    FROM #tab1

    WHERE KopfID = '2'

     

    UNION ALL

     

    SELECT Part.KopfId, Part.ZeileID

    FROM #tab1 AS Main

         INNER JOIN

         #tab1 AS Part

             ON Main.ZeileId = Part.KopfID

    WHERE Main.KopfID = '2'

     

    GO

    DROP TABLE #tab1

     

     

    KopfID ZeileID

    ------ -------

    2      1

    2      A

    A      1

    A      2

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 22. Oktober 2009 13:08
  • Hallo piccolinet,

    Hat Dir die Antwort geholfen?

    Grüße,
    Robert

    Sonntag, 1. November 2009 14:51
    Moderator
  • Hallo Marcelo,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Dienstag, 3. November 2009 15:32
    Moderator