提取父母标签和所有孩子标签的T-SQL查询

时间:2019-09-16 14:24:49

标签: sql sql-server tsql recursive-query

背景

我在SQL Server中有一个数据库架构,如下所示:

http://sqlfiddle.com/#!18/dc3cf/3

| id    | tag   | child_id  |
|----   |-----  |---------- |
| 1     | A     |           |
| 1     |       | 4         |
| 2     | C     |           |
| 3     | C     |           |
| 4     | B     |           |
| 4     |       | 5         |
| 5     | D     |           |
| 5     | E     |           |

每个“ id”记录都可以有一个子项(存储在同一表中)。每个孩子可以有任意数量的子孩子。我不知道层次结构级别的数量,但深度可能不超过10个级别。

在示例中,有:

  • 3个根元素:id的123
  • id为1的1个孩子和1个孩子的孩子:分别为id的45

问题

我需要能够查询以获取所有id的标签(包括所有子标签)的结果。例如,根据上面的表数据,我将需要输出以下内容:

| id    | tag   |
|----   |-----  |
| 1     | A     |
| 1     | B     |
| 1     | D     |
| 1     | E     |
| 2     | C     |
| 3     | C     |
| 4     | B     |
| 5     | D     |
| 5     | E     |

请注意,我需要孩子仍然出现。

是否可以在不将表自身联接到'n'的情况下多次出现,其中'n'是层次结构级别的数目?

编辑

为澄清起见,每个id也是一个根元素。因此,唯一的知道ID是否也是孩子的方法是查看并查看ID是否在有child_id的地方有另一条记录。我制作了另一个SQL Fiddle版本来证明这一点。请注意,id 2现在有一个孩子: http://sqlfiddle.com/#!18/422f9/1

| id    | tag   | child_id  |
|----   |-----  |---------- |
| 1     | A     |           |
| 1     |       | 4         |
| 2     | C     |           |
| 2     |       | 5         |
| 3     | C     |           |
| 4     | B     |           |
| 4     |       | 5         |
| 5     | D     |           |
| 5     | E     |           |

1 个答案:

答案 0 :(得分:0)

是的,可以不将表进行n次连接,可以使用CTE(公用表表达式)see Docs

根据您的情况,代码应类似于:

mouseover

编辑:动态确定基础元素。