我正在使用HierarchyId数据类型来存储位置。用户可能受限于位置 ( LocationId
)。如果用户有超过 1 个位置限制,则必须使用 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
) ;