【发布时间】:2013-07-29 11:58:35
【问题描述】:
我有一个 Locations 表,它使用 hierarchyid 列来映射城市/地区/国家/大陆。表格如下所示:
declare @Locations table (
LocationNodeID hierarchyid,
LocationID int,
LocationName varchar(50)
)
insert into @Locations (LocationNodeID, LocationID, LocationName) values
(cast('/0/' as hierarchyid), 1, 'World'),
(cast('/0/1/' as hierarchyid), 2, 'North America'),
(cast('/0/1/1/' as hierarchyid), 3, 'United States'),
(cast('/0/1/1/1/' as hierarchyid), 4, 'California'),
(cast('/0/1/1/1/1/' as hierarchyid), 5, 'Los Angeles'),
(cast('/0/1/1/1/2/' as hierarchyid), 6, 'San Francisco'),
(cast('/0/1/1/2/' as hierarchyid), 7, 'Ohio'),
(cast('/0/1/1/2/1/' as hierarchyid), 8, 'Cleveland'),
(cast('/0/1/1/2/2/' as hierarchyid), 9, 'Toledo');
我有第二张表将事件映射到位置。该表使层次结构变平,并且每个级别都有一个记录(我以这种方式继承了它)。因此,如果事件在洛杉矶,则此表中有 4 条事件记录:洛杉矶、加利福尼亚、美国、北美。同一活动也可以在多个地点举行。
declare @EventLocations table (
EventID int,
LocationID int
)
insert into @EventLocations (EventID, LocationID) values
(1, 2), -- North America
(1, 3), -- United States
(1, 4), -- California
(1, 5), -- Los Angeles (leaf)
(2, 2), -- North America
(2, 3), -- United States
(2, 7), -- Ohio (leaf)
(3, 2), -- North America
(3, 3), -- United States (leaf)
(4, 2), -- North America
(4, 3), -- United States
(4, 4), -- California (leaf)
(4, 7), -- Ohio
(4, 9); -- Toledo (leaf)
我正在尝试创建一个查询,从@EventLocations 中选择我已识别为叶节点的记录。这些是每个事件的记录,没有与@Locations 层次结构相关的后代。因此,位置可能是@EventLocations 中的“叶子”,但在@Locations 中有后代。我尝试了下面的查询,但它只提取了 @Locations 表中的叶子记录。
select ep.EventID, p.*, p2.*
from @EventLocations ep
inner join @Locations p on ep.LocationID = p.LocationID
left outer join @Locations p2 on p.LocationNodeID = p2.LocationNodeID.GetAncestor(1)
where p2.LocationID is null
order by ep.EventID, ep.LocationID
【问题讨论】:
标签: sql-server-2008 tsql hierarchyid