HierarchyID
forを使用してカテゴリのすべての子孫を見つける必要がありますSQL Server
。
直接の子供を見つける方法は知っていますが、子供たちの子供たちの子供たちを見つけたいです。
?を使用してこれを行う方法はありHierarchyID
ますか?
HierarchyID
forを使用してカテゴリのすべての子孫を見つける必要がありますSQL Server
。
直接の子供を見つける方法は知っていますが、子供たちの子供たちの子供たちを見つけたいです。
?を使用してこれを行う方法はありHierarchyID
ますか?
必要なツリーのルートがある場合は、次を使用できませんか。
DECLARE @root hierarchyID;
SELECT @root = col
FROM yourTable
WHERE [whatever uniquely identifies this row]
SELECT *
FROM yourTable
WHERE col.IsDescendantOf(@root) = 1
私の例では、テーブルが次のようなものであると仮定します。
DECLARE TABLE MyTable
(
HID hierarchyid PRIMARY KEY,
ID int IDENTITY(1, 1),
SomeText varchar(50)
);
ID 3 のノードのすべての子孫を (ルートから) 5 の最大レベルまで下げる場合:
DECLARE @searchNode hierarchyid;
SELECT @searchNode = HID
FROM MyTable
WHERE ID = 3;
SELECT *
FROM MyTable
WHERE HID.IsDescendantOf(@searchNode)
AND HID.GetLevel() <= 5;
代わりに、要求されたノードの下に 2 レベルの子が必要な場合は、最初の選択で検索ノードのレベルを取得し、比較を次のように変更する必要があります。
WHERE HID.IsDescendantOf(@searchNode) = 1
AND HID.GetLevel() <= (@searchLevel + 2);
コードの構造に応じて、子のみを返すか、親のみを返すか、またはその両方を返すかを柔軟に選択できるため、私はこの種のクエリの CTE のファンです。この場合、たとえば、両方の UNION を返しています。
declare @MyTable table
(
ID int not null,
HierId hierarchyid null
);
declare @id int
set @id = 1
;with parent (TenantId, HierId, IsParent) as
(
select
t.ID
,t.HierId
,cast(1 as bit) as IsParent
from @MyTable t
where t.ID = @id
), children as
(
select
t.ID
,t.HierId
,cast(0 as bit) as IsParent
from
@MyTable t
inner join parent p
on t.HierId.IsDescendantOf(p.HierId) = 1
)
select
*
from parent
UNION
select *
from children