メニューの hierarchyID と UserRights に問題があります。たとえば、ユーザーにレベル 4 の権限のみを付与したい場合、クエリはレベル 4 の子からすべての親を自動的に選択する必要があります。これを行う方法 ?
私の問題を理解していますか?私は単に子供からすべての親(祖先)が欲しいだけです。
マヌエルに挨拶
メニューの hierarchyID と UserRights に問題があります。たとえば、ユーザーにレベル 4 の権限のみを付与したい場合、クエリはレベル 4 の子からすべての親を自動的に選択する必要があります。これを行う方法 ?
私の問題を理解していますか?私は単に子供からすべての親(祖先)が欲しいだけです。
マヌエルに挨拶
私は最近 HierarchyId で多くの作業を行っており、別の質問への回答を探してこの質問に出くわしました。いくつかのことを説明しているので、この例をミックスに入れると思いました。まず、再帰 CTE なしで条件式を取得できます。次に、GetDescendantOf は包括的であるため、チェックする必要はありませんt1.NodeId = t2.NodeId
(そして、私は通常、サブクエリよりもジョインを好みます)。ここにあなたが遊ぶことができる完全なデモがあります:
BEGIN TRANSACTION
CREATE TABLE #HierarchyDemo
(
NodeId HIERARCHYID PRIMARY KEY NOT NULL,
Description AS NodeId.ToString(),
Depth AS NodeId.GetLevel()
)
INSERT INTO #HierarchyDemo VALUES ( HierarchyId::GetRoot() );
INSERT INTO #HierarchyDemo VALUES ( CAST ('/1979/' AS HIERARCHYID) );
INSERT INTO #HierarchyDemo VALUES ( CAST ('/2012/' AS HIERARCHYID) );
INSERT INTO #HierarchyDemo VALUES ( CAST ('/2012/2/' AS HIERARCHYID) );
INSERT INTO #HierarchyDemo VALUES ( CAST ('/1979/4/' AS HIERARCHYID) );
INSERT INTO #HierarchyDemo VALUES ( CAST ('/2012/2/17/' AS HIERARCHYID) );
INSERT INTO #HierarchyDemo VALUES ( CAST ('/1979/4/6/' AS HIERARCHYID) );
SELECT *
FROM #HierarchyDemo;
SELECT *
FROM #HierarchyDemo startingPoint
INNER JOIN #HierarchyDemo parent
ON startingPoint.NodeId.IsDescendantOf(parent.NodeId) = 1
WHERE startingPoint.Description = '/2012/2/17/'
ROLLBACK TRANSACTION
このようなものはCTEを回避します
SELECT t1.NodeId.ToString(), t1.Name
FROM (SELECT * FROM test_table2
WHERE Name = 'Node 1.1.1') t2
, test_table2 t1
WHERE
t1.NodeId = t2.NodeId OR
t2.NodeId.IsDescendantOf(t1.NodeId) = 1