2009-11-19 3 views
2

Je développe un programme de calcul des coûts Bill of Materials et j'ai du mal à imaginer une solution simple à certains sélections récursives que je veux. J'utilise SQL Server 2005 pour cette partie de l'application. Disons que j'ai le produit A, qui contient l'assemblage B, et la partie C. L'assemblage B contiendra les parties D et E, mais, là où je lutte, D et ou E peuvent contenir X nombre d'autres assemblages.la façon la plus simple de faire t-sql récursif pour plusieurs sélections

Je peux faire quelque chose comme:;

SELECT * FROM TBLBOM WHERE Parent = A 
UNION 
SELECT * FROM TBLBOM WHERE Parent = B 
UNION 
SELECT * FROM TBLBOM WHERE Parent = C 

Pour produire quelque chose dans le sens de;

PARENT COMP COST 
A   X  £1 
B   D  £0.5 
B   E  £0.5 
.... 
C   Y  £1 

Mais permet de dire le composant D est constitué de composants F & G, comment pourrais-je tenir compte dans une déclaration t-sql.

En un mot, je dois élargir la liste complète des composants de tous les ensembles qui sont associés à un produit parent indépendamment du fait qu'ils sont dans un sous-ensemble ou ensemble sous d'un sous-ensemble, etc ...

Idéalement, je voudrais éviter un curseur à tout prix :)

Toute aide/guidance serait appréciée.

Merci.

EDIT; Comme demandé, voici la structure de la table et la sortie attendue. Le parent est le DRAWINGNO et le nœud enfant est le PART (qui pourrait aussi être un parent en soi);

BOMID  DRAWINGNO   ITEM   PART    COST  
1303  HGR05180   1    HGR05370   1 
1304  HGR05180   2    HGF65050   4 
1305  HGR05180   3    HGF50340   1 
1312  HGR05370   1    HPN05075   1 
1313  HGR05370   2    HPN05085   2 
1314  HGR05370   3    HPN05080   1 
1848  EXP-18G   1    HGR05180   1 
1849  EXP-18G   2    HGR05210   3 
1850  EXP-18G   3    HGR05230   1 
1851  EXP-18G   4    HGR05140   1 
1852  EXP-18G   5    HGR05150   2 
1853  EXP-18G   6    HGR05050   1 
1854  EXP-18G   7    ESC05350   1 
1855  EXP-18G   8    ESC05330   3 
1856  EXP-18G   9    HGR05360   1 
1857  EXP-18G   10    HGR05370   2 
1858  EXP-18G   11    ESC05640   1 
+0

peut YUO fournir la table strucure –

Répondre

5

Si je comprends (et sans structure de la table), vous pouvez essayer quelque chose comme ça

DECLARE @Table TABLE(
     Component VARCHAR(50), 
     Parent VARCHAR(50), 
     Cost FLOAT 
) 

INSERT INTO @Table SELECT 'B', 'A', 1 
INSERT INTO @Table SELECT 'C', 'B', 2 
INSERT INTO @Table SELECT 'C', 'B', 3 
INSERT INTO @Table SELECT 'D', 'C', 4 

DECLARE @Product VARCHAR(50) 
SET @Product = 'A' 

;WITH Selects AS (
     SELECT * 
     FROM @Table 
     WHERE Parent = @Product 
     UNION ALL 
     SELECT t.* 
     FROM @Table t INNER JOIN 
       Selects s ON t.Parent = s.Component 
) 

SELECt * 
FROm Selects 
+0

parfait. Merci beaucoup :) – CaRDiaK

0

Vous souhaitez utiliser l'expression de table commune récursive (CTE). La documentation en ligne contient beaucoup d'informations sur la façon de les utiliser; Dans l'index, recherchez des CTE et sélectionnez l'entrée "Requêtes récursives à l'aide d'expressions de table communes". (J'ai rencontré des problèmes avant de créer un lien vers BOL en ligne, ou j'essayerais de le lier ici.)

De même, si vous affichez votre structure de table, vous devriez obtenir une demi-douzaine d'exemples en cinq minutes. Mieux encore, essayez de rechercher SO pour des exemples précédents.

Questions connexes