【发布时间】:2019-03-01 10:02:28
【问题描述】:
抱歉,如果这是在某处重复,在这里搜索和网络似乎与我的问题有相似但不完全匹配,所以我决定发布。
我将其称为多对多关系中的完全递归分组。我已经尝试编写 joins 和 ctes 来做到这一点,但没有完全递归,我只能深入一层,而且我对尝试编写嵌套动态游标并不十分兴奋。
假设表达式可以从这个“联结”表中导出以找到不同的学生/班级,因此可以仅使用一组来总结问题。
从学生班级中选择 *
+-------------+----------+--------------+
| student_id | class_id | group_number |
+-------------+----------+--------------+
| 1 | A | null |
| 1 | C | null |
| 2 | A | null |
| 2 | B | null |
| 2 | C | null |
| 3 | E | null |
| 4 | B | null |
| 4 | F | null |
+-------------+----------+--------------+
问题是如何通过递归关系为每个学生和每个班级填充组号。例如:如果 student_id 1 有 class_id A,那么其他学生有哪些 class_id A?对于其他学生,他们还有什么其他课程?对于每个其他课程,哪些其他学生有这些课程?然后继续遍历结果,直到找不到更多的依赖项。
所以在这个例子中,最终更新将只包含两个组,这样读取,因为没有其他学生有 class_id C 并且 student_id 3 没有其他类:
+-------------+----------+--------------+
| student_id | class_id | group_number |
+-------------+----------+--------------+
| 1 | A | 1 |
| 1 | C | 1 |
| 2 | A | 1 |
| 2 | B | 1 |
| 2 | C | 1 |
| 3 | E | 2 |
| 4 | B | 1 |
| 4 | F | 1 |
+-------------+----------+--------------+
【问题讨论】:
-
如果您使用的是 SQL Server 2017,请查看这篇关于图数据库函数 MATCH 的文章。 sqlshack.com/introduction-sql-server-2017-graph-database
-
感谢@Horaciux 的回复,我会检查一下。
标签: sql sql-server tsql