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 中的所有记录,包括 Electric
和 InterC
下的所有记录。
但是,您应该使 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'
以获得一个或另一个层次结构。
这是我的第一个 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 中的所有记录,包括 Electric
和 InterC
下的所有记录。
但是,您应该使 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'
以获得一个或另一个层次结构。