2016-05-19 7 views
1

Ich habe eine Link-Struktur-Tabelle mit ID und ParentID.Sql Rekursive Funktion zeigen nur Nods, die specific Beziehung haben

ID, Parent, name 
1,1 
2,1 
3,2 
4,3 
5,3 

dieser Tabelle ich eine structure_article Beziehungstabelle haben in dieser Tabelle Ich habe Beziehung zwischen einer Verbindung und einem Artikel.

struture_article

structid, articleID 
4,1000 
4,1001 
5,1002 

Jeder Artikel in dieser Tabelle haben einen Lieferanten. Jetzt versuche ich eine rekursive Funktion zu erstellen, die den Baum erstellt nickt, wenn ich einen bestimmten Anbieter auswählen.

Artikel Tisch

ArticleID, SUPPLIER ID 
1000,1 
1001,2 
1002,2 

Wenn ich mit Lieferanten holen Artikel 1, dann möchte ich die Funktion mir die Baumstruktur zeigen, die von diesem Anbieter Artikel haben.

Ich habe 20 Lieferanten und 300 Verbindungen in der DB jetzt will ich nur Artikel von den Lieferanten zeigen, die ich auswähle. Ich will kein leeres Nicken.

Ist das überhaupt möglich, erstellen Sie mit einer rekursiven Funktion in Sql Server Version 2008?

I tyied wiht diesem Code das Problem ist, dass ich nur Nicken erhalten, die Artikel

  WITH a 
    AS (SELECT * 
     FROM structure 
     WHERE parent = 125 

     UNION ALL 
     SELECT m.* 
     FROM structure m 
       JOIN a 
        ON m.parent = a.internidstructure) 
SELECT * 
FROM a 
WHERE internidstructure IN (SELECT DISTINCT(internidstructure) 
          FROM dbo.articles 
            INNER JOIN dbo.structure_article 
              ON dbo.articles.internidarticle = 
dbo.structure_article.internidarticle 
WHERE (dbo.articles.internidsupplier IN (SELECT 
internidsupplier 
         FROM site_sup 
         WHERE 
internidsite = 1))) 
ORDER BY parent, 
      sortno 
+0

Können Sie ein Beispiel für Ihre erwartete Ausgabe geben. – Griffin

+0

Es wäre auch hilfreich, wenn Ihre Beispieldaten exakt mit dem Schema der Beispielabfrage übereinstimmen. – Griffin

Antwort

0

Versuchen Sie, einen linken verbinden, anstatt eine innere Verknüpfung verbunden sind.

+0

Die WHERE-Anweisung funktioniert gut, ich bekomme alle Strukturen, die den spezifischen Anbieter haben, ist der Teil der Schleife den gesamten Baum für die spezifischen Nicken, die das Problem ist. Ein Artikel kann unter 3-4 Ebenen existieren. – Mako

+0

Ich bezog mich auf die Join innerhalb der Cte, ich würde Sample-Ausgabe und vollständigere Beispiel-Eingabe benötigen, um sicher zu sein, das Root-Problem, aber aus meiner Erfahrung und Ihrer Beschreibung klingt es wie ein Join-Problem. –

0

Ich bin mir nicht sicher, ob Sie Ihre Anforderungen verstanden haben, aber wenn Sie eine neue Baumtabelle ohne Knoten haben möchten, die nicht mit einem Lieferanten verknüpft sind, kann diese Abfrage funktionieren.

WITH A AS 
(
SELECT S.ID as ID, S.Parent as Parent, 1 as art_linked 
FROM structure S 
     INNER JOIN dbo.structure_article SA 
      ON S.ID = SA.structid 
     INNER JOIN Article AR 
      ON AR.ArticleID = SA.ArticleID 
WHERE AR.SupplierID = 1 

UNION ALL 
SELECT S.ID, S.Parent, 0 
FROM structure S 
     INNER JOIN A 
       ON A.parent = S.ID 
WHERE S.ID <> S.Parent 
) 

SELECT A.ID, A.Parent, MAX(A.art_linked) 
FROM A 
GROUP BY A.ID, A.Parent