【发布时间】:2012-05-05 08:42:23
【问题描述】:
我使用 HierarchyId 数据类型来存储位置。用户可能受限于位置 (LocationId)。如果用户有超过 1 个位置限制,则必须使用 OR 再次调用 HierarchyId 数据类型的 IsDescendantOf 方法。
示例(按 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 可以像 sql IN 子句一样工作吗?
使用的表格:
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
) ;
【问题讨论】:
标签: sql sql-server sql-server-2008 hierarchyid