SQL 树/分层数据

SQL Tree / Hierarchial Data

这是我的第一个 post,我正在尝试创建一个 sql 树 table 遍历。例如,如果有人单击名为 Categories 的下拉列表,它将显示 Electric 和 InterC。然后,如果用户点击电气,它会下拉继电器和开关,接下来如果用户点击继电器,它会下拉 X 个继电器,如果用户点击开关,它会下拉 Y 开关。我在下面尝试过,但我不明白的部分是,如果我有另一个类别 InterC,我该如何制作另一个级别的下拉菜单?

Table 类别

insert test select 1, 0,'Electric'
insert test select 2, 1,'Relays'
insert test select 3, 1,'Switches'
insert test select 5, 2,'X Relays'
insert test select 6, 2,'Y Switches'
insert test select 7, 0,'InterC'
insert test select 8, 1,'x Sockets'
insert test select 9, 1,'y Sockets'
insert test select 10, 2,'X Relays'
insert test select 11, 2,'Y Relays'
;

create table test(id int,parentId int,name varchar(50)) 
WITH tree (id, parentid, level, name) as  (    
  SELECT id, parentid, 0 as level, name 
  FROM test    WHERE parentid = 0
  UNION ALL
  SELECT c2.id, c2.parentid, tree.level + 1, c2.name    
  FROM test c2 
   INNER JOIN tree ON tree.id = c2.parentid 
) 
SELECT * 
FROM tree 
order by parentid

您的分层 T-SQL 查询应该 return table 中的所有记录,包括 ElectricInterC 下的所有记录。

但是,您应该使 parentId 可以为 null,并让根记录具有 null 而不是 0。这将使您可以添加一个外键来保护您的数据完整性(不可能错误地添加孤立记录)。

你的层次结构查询 return 你所有的记录,我猜你想一次 return 一个 - 为此添加一个 where 条件开始查询。

WITH tree (id, parentid, level, name) as (    
    SELECT id, parentid, 0 as level, name 
    FROM test    
    WHERE name = @category AND
        parentId is null
    UNION ALL
    SELECT c2.id, c2.parentid, tree.level + 1, c2.name    
    FROM test c2 
        INNER JOIN tree ON tree.id = c2.parentid 
) 
SELECT * 
FROM tree 
order by parentid

然后将 @category 设置为 'Electric''InterC' 以获得一个或另一个层次结构。