![](/img/trans.png)
[英]Simple join table assigning default values for each row (sql fiddle included)
[英]SQL Server - When selecting how to propagate values on the top level of a tree? (SQL Fiddle included)
我需要在树的顶层传播值:
CREATE TABLE [dbo].[area](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[parent_id] [int] NULL,
[color] [varchar](50) NULL,
[priority] [int] NULL)
insert into area values('root', NULL, NULL, NULL);
insert into area values('test1', 1, NULL, NULL);
insert into area values('test2', 2, 'red', 50);
insert into area values('test3', 5, 'blue', 1);
insert into area values('test4', 1, 'yellow', 10);
ID | parent_id | 姓名 | 颜色 | 优先 | 等级 | path_id | 路径名 |
---|---|---|---|---|---|---|---|
1 | (无效的) | 根 | (无效的) | (无效的) | 0 | 1 | 根 |
2 | 1 | 测试1 | (无效的) | (无效的) | 1 | 1\2 | 根\test1 |
5 | 1 | 测试4 | 黄色 | 10 | 1 | 1\5 | 根\test4 |
4 | 5 | 测试3 | 蓝色的 | 1 | 2 | 1\5\4 | 根\test4\test3 |
3 | 2 | 测试2 | 红色的 | 50 | 2 | 1\2\3 | 根\test1\test2 |
我正在使用以下查询(下一个过程使用 CTE)来执行此操作:
WITH tPATH
AS (SELECT id,
parent_id,
name,
color,
priority,
0 as [level],
CAST(id AS NVARCHAR(MAX)) As path_id,
CAST(name AS NVARCHAR(MAX)) As path_name
FROM area
WHERE parent_id is NULL
UNION ALL
SELECT area.id,
area.parent_id,
area.name,
area.color,
area.priority,
[level] + 1,
CONCAT(tPATH.path_id, '\', CAST(area.id AS NVARCHAR(MAX))),
CONCAT(tPATH.path_name, '\', CAST(area.name AS NVARCHAR(MAX)))
FROM area
INNER JOIN tPATH
ON area.parent_id = tPATH.id
)
select *
from tPATH;
优先级 1 是最好的。 所以我想要这个:
ID | parent_id | 姓名 | 颜色 | 优先 | 等级 | path_id | 路径名 |
---|---|---|---|---|---|---|---|
1 | (无效的) | 根 | 蓝色的 | 1 | 0 | 1 | 根 |
2 | 1 | 测试1 | 红色的 | 50 | 1 | 1\2 | 根\test1 |
5 | 1 | 测试4 | 蓝色的 | 1 | 1 | 1\5 | 根\test4 |
4 | 5 | 测试3 | 蓝色的 | 1 | 2 | 1\5\4 | 根\test4\test3 |
3 | 2 | 测试2 | 红色的 | 50 | 2 | 1\2\3 | 根\test1\test2 |
有什么想法吗(在顶层传播颜色和优先级)? 小提琴|| SQL 化
提前致谢。
您可以使用查询计算所有节点后代的最低有效优先级
WITH tPATH
AS (SELECT id,
id [top],
parent_id,
priority
FROM area
UNION ALL
SELECT area.id,
[top],
area.parent_id,
area.priority
FROM area
INNER JOIN tPATH
ON area.parent_id = tPATH.id
)
select [top] as id, min(priority) effective_priority
from tPATH
group by [top];
根据@Serg 的回答,我创建了这段代码,它给了我预期的结果。 能不能简单点?
WITH tPATH
AS (SELECT id,
parent_id,
name,
color,
priority,
0 [level],
CAST(id AS NVARCHAR(MAX)) [path_id],
CAST(name AS NVARCHAR(MAX)) [path_name]
FROM area
WHERE parent_id is NULL
UNION ALL
SELECT area.id,
area.parent_id,
area.name,
area.color,
area.priority,
[level] + 1,
CONCAT(tPATH.path_id, '\', CAST(area.id AS NVARCHAR(MAX))),
CONCAT(tPATH.path_name, '\', CAST(area.name AS NVARCHAR(MAX)))
FROM area
INNER JOIN tPATH
ON area.parent_id = tPATH.id
),
tDIFF
AS (SELECT id,
id [top],
parent_id,
color,
priority
FROM area
UNION ALL
SELECT area.id,
[top],
area.parent_id,
area.color,
area.priority
FROM area
INNER JOIN tDIFF
ON area.parent_id = tDIFF.id
),
tDIFFEND
AS (select [top] as id,
min(color) effective_color,
min(priority) effective_priority
from tDIFF
group by [top]
)
SELECT tPATH.id,
tPATH.parent_id,
name,
effective_color [color],
effective_priority [priority],
level,
path_id,
path_name
from tPATH
INNER JOIN tDIFFEND
ON tDIFFEND.id = tPATH.id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.