6

メニューの hierarchyID と UserRights に問題があります。たとえば、ユーザーにレベル 4 の権限のみを付与したい場合、クエリはレベル 4 の子からすべての親を自動的に選択する必要があります。これを行う方法 ?

私の問題を理解していますか?私は単に子供からすべての親(祖先)が欲しいだけです。

マヌエルに挨拶

4

4 に答える 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
于 2013-03-19T20:01:51.117 に答える
3

このようなものは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
于 2011-08-03T15:26:56.207 に答える