从 SQL 服务器中的 URL 个部分的单个分层 table 页面组成 URL
Composing URL from single hierarchical table of pages with URL parts in SQL Server
我有一个包含 4 个字段的页面 table;
ID | ParentID | Name | URL Part
ParentID 可以为空。空 ParentID 记录代表顶级页面。
URL 部分字段仅包含该页面的 URL 部分。当记录包含 ParentID 时,父项的 URL 部分将添加到子项的前面。最多可以嵌套4层。
例如2 行;
ID | ParentID | Name | URLPart
---+----------+--------------------+-----------------
1 | NULL | Wildlife | wildlife
2 | 1 | Otters and beavers | otters-beavers
我想在没有游标的 SQL 查询中获取第 2 行的值 /wildlife/otters-beavers
。 URL 部分省略了斜线,但需要在组合列中分隔 url 部分。
我开始在 LINQ 中这样做,但它有点混乱,所以希望可以将它移到数据库中。
感谢任何帮助,
谢谢,
尼克
您可以使用 Recursive Common Table Expression:
DECLARE @t TABLE
( ID INT NOT NULL,
ParentID INT NULL,
Name VARCHAR(255) NOT NULL,
URLPart VARCHAR(255) NOT NULL
);
INSERT @T (ID, ParentID, Name, URLPart)
VALUES
(1, NULL, 'Wildlife', 'Wildlife'),
(2, 1, 'Otters and beavers', 'otters-beavers'),
(3, 1, 'Canines', 'canines'),
(4, 3, 'dogs', 'dogs');
WITH CTE AS
( SELECT ID, ParentID, Name, URLPart, RecursionLevel = 1, FullURL = URLPart
FROM @T
UNION ALL
SELECT cte.ID,
t.ParentID,
cte.Name,
cte.URLPart,
cte.RecursionLevel + 1,
CAST(t.URLPart + '/' + cte.FullURL AS VARCHAR(255))
FROM CTE
INNER JOIN @T AS t
ON t.ID = cte.ParentID
)
SELECT ID, Name, URLPart, FullURL
FROM CTE
WHERE NOT EXISTS
( SELECT 1
FROM CTE AS CTE2
WHERE CTE2.ID = CTE.ID
AND CTE2.RecursionLevel > CTE.RecursionLevel
)
ORDER BY ID;
我有一个包含 4 个字段的页面 table;
ID | ParentID | Name | URL Part
ParentID 可以为空。空 ParentID 记录代表顶级页面。
URL 部分字段仅包含该页面的 URL 部分。当记录包含 ParentID 时,父项的 URL 部分将添加到子项的前面。最多可以嵌套4层。
例如2 行;
ID | ParentID | Name | URLPart
---+----------+--------------------+-----------------
1 | NULL | Wildlife | wildlife
2 | 1 | Otters and beavers | otters-beavers
我想在没有游标的 SQL 查询中获取第 2 行的值 /wildlife/otters-beavers
。 URL 部分省略了斜线,但需要在组合列中分隔 url 部分。
我开始在 LINQ 中这样做,但它有点混乱,所以希望可以将它移到数据库中。
感谢任何帮助,
谢谢,
尼克
您可以使用 Recursive Common Table Expression:
DECLARE @t TABLE
( ID INT NOT NULL,
ParentID INT NULL,
Name VARCHAR(255) NOT NULL,
URLPart VARCHAR(255) NOT NULL
);
INSERT @T (ID, ParentID, Name, URLPart)
VALUES
(1, NULL, 'Wildlife', 'Wildlife'),
(2, 1, 'Otters and beavers', 'otters-beavers'),
(3, 1, 'Canines', 'canines'),
(4, 3, 'dogs', 'dogs');
WITH CTE AS
( SELECT ID, ParentID, Name, URLPart, RecursionLevel = 1, FullURL = URLPart
FROM @T
UNION ALL
SELECT cte.ID,
t.ParentID,
cte.Name,
cte.URLPart,
cte.RecursionLevel + 1,
CAST(t.URLPart + '/' + cte.FullURL AS VARCHAR(255))
FROM CTE
INNER JOIN @T AS t
ON t.ID = cte.ParentID
)
SELECT ID, Name, URLPart, FullURL
FROM CTE
WHERE NOT EXISTS
( SELECT 1
FROM CTE AS CTE2
WHERE CTE2.ID = CTE.ID
AND CTE2.RecursionLevel > CTE.RecursionLevel
)
ORDER BY ID;