![](/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.