【发布时间】:2016-12-01 00:21:59
【问题描述】:
我目前有一个如下所示的表格:
| A_URN | B_URN | ID |
|-------|-------|----|
| 101 | 901 | 0 |
|-------|-------|----|
| 102 | 901 | 0 |
|-------|-------|----|
| 101 | 902 | 0 |
|-------|-------|----|
| 102 | 902 | 0 |
|-------|-------|----|
| 201 | 902 | 0 |
|-------|-------|----|
| 201 | 903 | 0 |
|-------|-------|----|
| 202 | 903 | 0 |
|-------|-------|----|
| 301 | 904 | 0 |
|-------|-------|----|
| 302 | 904 | 0 |
|-------|-------|----|
| 301 | 905 | 0 |
|-------|-------|----|
| 302 | 905 | 0 |
|-------|-------|----|
| 303 | 905 | 0 |
|-------|-------|----|
| 101 | 906 | 0 |
我需要添加一个标识符,将所有相关项目组合在一起。
例如,A_URN 101 连接到 B_URN 901、902 和 906,并且 B_URN 901、902 和 906 还包含 A_URN 102 和 201
A_URN 201 也连接到 B_URN 903 等等。
最终结果应该类似于:
| A_URN | B_URN | ID |
|-------|-------|----|
| 101 | 901 | 1 |
|-------|-------|----|
| 102 | 901 | 1 |
|-------|-------|----|
| 101 | 902 | 1 |
|-------|-------|----|
| 102 | 902 | 1 |
|-------|-------|----|
| 201 | 902 | 1 |
|-------|-------|----|
| 201 | 903 | 1 |
|-------|-------|----|
| 202 | 903 | 1 |
|-------|-------|----|
| 301 | 904 | 2 |
|-------|-------|----|
| 302 | 904 | 2 |
|-------|-------|----|
| 301 | 905 | 2 |
|-------|-------|----|
| 302 | 905 | 2 |
|-------|-------|----|
| 303 | 905 | 2 |
|-------|-------|----|
| 101 | 906 | 1 |
我编写了一个使用 WHILE() 循环完成此任务的查询,但被要求将其重新编写为递归 CTE。 我已经尝试过,但总是需要在不允许的递归成员中使用 MIN 或 GROUP BY。
是否有可能使用递归查询得到这种结果?
【问题讨论】:
-
你能用while循环发布解决方案吗?
-
您使用什么 RDBMS(MSSQL、Oracle)?
标签: sql recursion common-table-expression