2017-03-27 23 views
0

私はテーブルを持っており、アセンブリと呼ぶことができます。この表には、これらの項目の項目とコンポーネントがあります。さらに、これらのコンポーネントのそれぞれは、独自のコンポーネントを持つアイテムとしてリストされ、サブアセンブリのリストが作成されます。ネストされたサブアセンブリの検索クエリ

ここに私のSQLフィドルです。この例では

http://sqlfiddle.com/#!3/ec9e9/1

、部分A1000はz123を含んT4000が含まH123を、含んでいます。そのアセンブリの一部ではない別の部分があります。入れ子になっているサブアセンブリの数を定義せずに、A1000の各サブアセンブリにドリルダウンするクエリを設計する方法はありますか?

結果は次のようになります。

item component qty 
A1000 h123  4 
h123 T4000  7 
T4000 z123  2 
z123 f2222  4 

は、再帰共通テーブル式(CTE)は、このようなものに適しています本体A1000

+0

結果を含めるべきか、それはどのようになっているはずですか? – tire0011

+0

あなたの質問に答えるように更新されました。 – d90

+1

フィドルがダウンしています。質問に必要なデータを含めてください。 – Paparazzi

答えて

1

上記のCTEを関数として作成しました。

CREATE FUNCTION dbo.FN_GetAssemblyChildren (@item CHAR(30)) 
RETURNS TABLE 
AS 
RETURN 
(

    WITH cteAssemblies (item, component, qty, AssemblyLevel) 
    AS 
    ( SELECT 
      item, component, qty, 1 
     FROM 
      dbo.Assemblies b 
     WHERE 
      item = @item 
     UNION ALL 
     SELECT 
      e.item, e.component, e.qty, r.AssemblyLevel + 1 
     FROM 
      dbo.Assemblies e 
     INNER JOIN 
      cteAssemblies r ON e.item = r.component 
    ) 
    SELECT item, component, qty FROM cteAssemblies 

); 

GO 

クエリ機能

SELECT * FROM dbo.FN_GetAssemblyChildren ('A1000') 
2

にないものだけを省略する。 これはいかがですか?

;WITH cteAssemblies (item, component, qty, AssemblyLevel) 
AS 
( SELECT 
     item, component, qty, 1 
    FROM 
     dbo.Assemblies b 
    WHERE 
     item = 'A1000' 
    UNION ALL 
    SELECT 
     e.item, e.component, e.qty, r.AssemblyLevel + 1 
    FROM 
     dbo.Assemblies e 
    INNER JOIN 
     cteAssemblies r ON e.item = r.component 
) 
SELECT item, component, qty FROM cteAssemblies 
+0

これはビューで使用できますか? – d90

+0

はい、パラメータをビューに渡すことはできません(例: "A1000")。私はこれを関数に変更することができます。この関数には、パラメータが渡されます。 –

関連する問題