親子関係のSQLクエリ
-
03-07-2019 - |
質問
次のような親子関係を持つ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
所属していません StackOverflow