2017-12-04 27 views
1

私はDBの専門家がSQL Server 2012の下のシナリオでcteを書き込もうとしていましたが、問題を解決できませんでした。これを理解するのに役立つ人がいれば、感謝します。再帰的多対多CTE

私はテーブルJobcardとitemsのためにJockcard2Itemと呼ばれる多くのテーブルを持っています。私の場合は

私は怒鳴るように与えられたアイテムIDのすべてのJobcardsを知りたい、

ジョブ・カードは、複数の項目を有することができ、項目が多くJobcardsを持つことができます。

  • 項目1、項目2、項目4

を持つアイテム3

  • jobcard4を持つアイテム3
  • jobards3を持つ項目2.
  • jobcard2を持つjobcard1私が取得したいです指定されたアイテムに関連付けられているすべてのジョブカード。他のアイテムがある場合は、同じジョブカードを参照しているアイテム( アイテム2を参照しているjobcard2など)そのジョブカードも。

    結果は、私は無限実行されている以下のクエリをしようとしていたjobcard1、jobcard3、jobcard3、

  • を返す必要があります。怒鳴る

    id jobcard_ID, item_ID 
    1  512   12 
    2  512   13 
    3  513   13 
    4  513   14 
    5  514   14 
    6  515   15 
    7  516   16 
    

    として

    DECLARE @itemId int 
    SELECT @itemId = 12 
    
    ;WITH temp as(
        SELECT jobCard_ID, item_id FROM Jobcard2Item 
        WHERE item_id = @EstimateID 
    
        UNION ALL 
    
        SELECT bi.jobCard_ID ,bi.item_id FROM Jobcard2Item 
        JOIN temp x ON bi.jobCard_ID= x.jobCard_ID where x.item_id not IN (bi.item_id) 
    ) 
    
    select * from temp option (maxrecursion 0) 
    

    サンプル日付それが結果を返さなければならないのitem_idとして、私は12を渡す - 512513514、

    +0

    サンプルデータを提供すると多くの助けになります。 –

    +0

    サンプルデータを追加しました。どうぞご覧ください。 – inspiedar

    答えて

    1

    このクエリは助けるべきである:

    select distinct A.jobcard_id from Jockcard2Item A join Jockcard2Item B 
    on A.jobcard_id = B.jobcard_id or A.item_id = B.item_id 
    where A.item_id <> B.item_id or A.jobcard_id <> B.jobcard_id 
    

    をそれはCTEを必要としません(試しましたが、不可能だと思います)。

    関連する問題