13

私は親子関係を持つ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 クエリを書きたいと思います。

たとえば、nodeId = 1 の場合、3、4、5、6 を返す必要があります。

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

4

4 に答える 4

10
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]
于 2008-10-16T03:17:39.533 に答える
6

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

于 2008-11-17T13:56:32.987 に答える
4

そして、それ自体が親である場合に機能することを確認するためです(そうでない場合は、壊れるまで再帰します):

   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]
于 2009-05-06T06:45:19.143 に答える
1
 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
于 2011-01-20T07:52:06.537 に答える