【问题标题】:SQL recursion + column concatenationSQL 递归 + 列连接
【发布时间】:2020-03-12 14:07:28
【问题描述】:

我有一个自引用表(在 SQL Server 中):

Page
==========
Id: int
RelativeUrl: nvarchar(max)
ParentId: int -> FK to pageId

示例数据:

ID | RelativeUrl | ParentId
===============================
1  | /root       | null
2  | /test1      | 1
3  | /test2      | 1
4  | /test3      | 1
5  | /test1-1    | 2
6  | /test1-2    | 2
7  | /test1-1-1  | 5

我想创建一个 sql 查询来检索具有完整相对 url 的表的所有页面。 我考虑过使用递归 SQL 查询,但不知道如何连接 relativeurl 以使其成为完整的相对 url。

想要的结果:

ID | FullRelativeUrl                | ParentId
===================================================
1  | /root                          | null
2  | /root/test1                    | 1
3  | /root/test2                    | 1
4  | /root/test3                    | 1
5  | /root/test1/test1-1            | 2
6  | /root/test1/test1-2            | 2
7  | /root/test1/test1-1/test1-1-1  | 5

【问题讨论】:

  • 标记您正在使用的 DBMS。
  • 什么关系型数据库?这对于回答这类问题非常重要。
  • 抱歉,忘记那部分了。它是 SQL Server

标签: sql sql-server concatenation self-referencing-table


【解决方案1】:

您可以使用递归 CTE:

with cte as (
      select id, convert(varchar(max), relativeurl) as url, 1 as lev
      from page
      where parentid is null
      union all
      select p.id, concat(cte.url, p.relativeurl), lev + 1
      from cte join
           page p
           on p.parentid = cte.id
     )
select cte.*
from cte;

Here 是一个 dbfiddle。

【讨论】:

  • 如果斜线是数据的一部分,你不需要连接另一个,你最终会得到 /root//test1...
猜你喜欢
  • 2016-01-14
  • 2013-07-31
  • 2017-05-28
  • 2013-12-06
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多