0

我有一个使用 SQL Server 层次结构 ID 设置的产品类别表,我想在 CMS 中创建一个自动完成下拉列表,该下拉列表返回匹配类别的搜索,而不仅仅是显示匹配的类别名称还显示它的层次结构/路径 例如

用户开始搜索“猫”并在他们看到的自动完成中

  • 宠物用品 > 猫
  • 宠物用品 > 猫 > 猫粮
  • 宠物用品 > 毛毛虫
  • 宠物活动 > 狗 > 抓捕游戏

有没有简单的方法可以做到这一点?我发现的示例侧重于选择首先选择的单个特定节点的父节点,但我找不到任何选择多个节点然后选择匹配节点的所有父节点的示例。

从数据库中检索结果后,我很乐意将结果按上述格式进行处理,但它获取的数据似乎是棘手的部分。

我正在使用 SQL Server 2012(不过我认为这并不重要)

这是我的架构(没什么特别的):

CREATE TABLE [dbo].[Category] (
[CategoryId]            INT                     IDENTITY (1, 1) NOT NULL,
[PrimaryProductId]      INT                     NULL,
[CategoryNode]          [sys].[hierarchyid]     NOT NULL,
[CategoryString]        AS                      ([CategoryNode].[ToString]()) PERSISTED,
[CategoryLevel]         AS                      ([CategoryNode].[GetLevel]()) PERSISTED,
[Title]                 NVARCHAR (50)           NOT NULL,
[IsActive]              BIT                     DEFAULT ((1)) NOT NULL,
CONSTRAINT [Category_CategoryId_PK] PRIMARY KEY CLUSTERED ([CategoryId] ASC),
CONSTRAINT [Category_Product_PrimaryProductId] FOREIGN KEY (PrimaryProductId) REFERENCES [dbo].[Product](ProductId),
UNIQUE NONCLUSTERED ([CategoryNode] ASC)

);

这是单行父母的示例:

 DECLARE @person hierarchyid

SELECT @person = Id
FROM dbo.HierachyTable
WHERE [Name] = 'Joe Blow';

SELECT
    Id, Id.ToString() AS [Path], 
    Id.GetLevel() AS [Level],
    Id.GetAncestor(1),
    Name
FROM 
    dbo.HierarchyTable
WHERE 
    @person.IsDescendantOf(Id) = 1
4

1 回答 1

1

这是一个表值函数,给定一个hierarchyid,将返回hierarchyid的所有祖先。

alter function dbo.GetAllAncestors(@h hierarchyid, @ReturnSelf bit)
returns table
as return
    select @h.GetAncestor(n.Number) as h
    from dbo.Numbers as n
    where n.Number < @h.GetLevel()

    union all

    select @h
    where @ReturnSelf = 1
go

Numbers 表只是一个计数表(如果您从未听说过,请使用 Google 搜索)。对于您的“Joe Blow”示例,这应该有效:

SELECT t.*
FROM dbo.HierarchyTable as h
cross apply dbo.GetAllAncestors(h.CategoryNode, 1) as a
join dbo.HierarchyTable as t
   on a.h = t.CategoryNode
WHERE h.[Name] = 'Joe Blow';
于 2015-10-07T02:46:21.893 回答