簡體   English   中英

SQL 服務器 - 選擇如何在樹的頂層傳播值時? (包括 SQL Fiddle)

[英]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 1 中,優先級為 1,
  • red 必須在 id 2 中,優先級為 50,
  • 藍色必須在 id 5 中,優先級為 1,
  • id 4 和 3 保持不變。
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM