2016-05-19 1 views
1

J'ai une table de structure de lien avec ID et parentID.La fonction récursive Sql affiche uniquement les nœuds ayant une relation spécifique

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

À cette table, j'ai une table de relation structure_article dans ce tableau j'ai relation entre un lien et un article.

struture_article

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

Chaque article dans ce tableau ont un fournisseur. Maintenant, j'essaie de créer une fonction récursive qui crée l'arbre si je choisis un fournisseur spécifique.

Article Table

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

Si je cueille des articles avec le fournisseur 1 alors je veux la fonction de me montrer la structure des arbres qui ont des articles de ce fournisseur.

J'ai maintenant 20 fournisseurs et 300 liens dans la base de données maintenant je veux seulement montrer des articles des fournisseurs que je choisis. Je ne veux pas de hochements de tête vides.

Est-ce encore possible créer avec une fonction récursive dans Sql Server version 2008?

Je tyied wiht ce code, le problème est que je reçois seulement hoche la tête qui ont des articles reliés

  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

Pouvez-vous donner un exemple de votre sortie attendue. – Griffin

+0

Il serait également utile que vos données d'exemple correspondent exactement au schéma de l'exemple de requête. – Griffin

Répondre

0

Essayez d'utiliser une jointure gauche au lieu d'une jointure interne.

+0

L'instruction where fonctionne bien, j'obtiens toutes les structures qui ont le fournisseur spécifique, c'est la partie de boucler l'arbre entier pour les nœuds spécifiques qui est le problème. Un article peut exister sous 3-4 niveaux. – Mako

+0

Je faisais référence à la jointure dans le cte, j'aurais besoin d'un exemple de sortie et d'un exemple plus complet pour être sûr du problème de racine, mais d'après mon expérience et votre description cela ressemble à un problème de jointure. –

0

Je ne suis pas sûr d'avoir compris votre besoin, mais si vous voulez avoir une nouvelle table arborescente sans nœuds non liés à un fournisseur, cette requête peut fonctionner.

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