質問

次のような親子関係を持つdbテーブルがあります:

NodeId    NodeName    ParentId
------------------------------
1         Node1       0
2         Node2       0
3         Node3       1
4         Node4       1
5         Node5       3
6         Node6       5
7         Node7       2

ここで、parentId = 0は、ルートレベルノードであることを意味します。ここで、親カテゴリのすべてのレベルで子を返すSQLクエリを作成します。

e.g。 nodeId = 1の場合、3、4、5、6を返します。

私はMS SQL Server 2005を使用しています

役に立ちましたか?

解決

with [CTE] as (
    select * from [TheTable] c where c.[ParentId] = 1
    union all
    select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
)
select * from [CTE]

他のヒント

SQLデータベース内の親子関係にネストセットモデルの使用を検討する必要があります。このようにテーブルにレコードのparentIDを保存するよりもはるかに優れており、このようなクエリをはるかに簡単にします。

そして、それがそれ自身の親である場合に動作することを確認するためだけです(そうでなければ、壊れるまで再帰します):

   with [CTE] as (
        select * from [TheTable] c where c.[ParentId] = 1
        union all
        select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
        and c.[ParentId] <> c.[NodeId]
    )
    select * from [CTE]
 WITH Temp_Menu AS
 ( 
  SELECT AM.* from FCB_AccessMenu AM where AM.[ParentId] = 6   

           UNION ALL     

        SELECT AM.* FROM  FCB_AccessMenu AM ,Temp_Menu TM  WHERE AM.[ParentID]=TM.[MenuID]        

  )   

  SELECT * FROM Temp_Menu ORDER BY ParentID
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top