場所の保存にHierarchyIdデータ型を使用しています。ユーザーは場所によって制限される場合があります ( LocationId
)。ユーザーに複数のロケーション制限がある場合、HierarchyId データ型の IsDescendantOf メソッドをOR
.
例 (LocationId 5 および 6 で従業員をフィルター処理):
SELECT * FROM Employee
INNER JOIN Location ON Employee.LocationId = Location.LocationId
WHERE Location.Node.IsDescendantOf((SELECT TOP 1 Node
FROM Location
WHERE LocationId = 5)) = 1
OR
Location.Node.IsDescendantOf((SELECT TOP 1 Node
FROM Location
WHERE LocationId=6)) = 1`
これは 2 つのLocationId
フィルターでは問題なく機能しますが、これが大きくなり、ある人が 10 個のフィルターを持っている場合はどうなるでしょうか。IsDescendantOf は sqlIN
句のように機能しますか?
使用したテーブル:
CREATE TABLE Location (
LocationId int NOT NULL PRIMARY KEY IDENTITY(1,1),
Name nvarchar(100) NOT NULL,
[Node] hierarchyid NOT NULL,
[ParentNode] AS ([Node].[GetAncestor]((1))) PERSISTED,
[Level] AS ([Node].[GetLevel]()) PERSISTED,
);
CREATE TABLE [dbo].[Employee] (
[EmployeeId] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[LocationId] [int] NULL,
[Name] [nvarchar](50) NULL
) ;