【发布时间】:2018-03-05 15:00:48
【问题描述】:
我有一个保存一些个人信息的人员表。如下表所示。
+----+------+----------+----------+--------+
| ID | name | motherID | fatherID | sex |
+----+------+----------+----------+--------+
| 1 | A | NULL | NULL | male |
| 2 | B | NULL | NULL | female |
| 3 | C | 1 | 2 | male |
| 4 | X | NULL | NULL | male |
| 5 | Y | NULL | NULL | female |
| 6 | Z | 5 | 4 | female |
| 7 | T | NULL | NULL | female |
+----+------+----------+----------+--------+
我也保持人与人之间的婚姻关系。喜欢:
+-----------+--------+
| HusbandID | WifeID |
+-----------+--------+
| 1 | 2 |
| 4 | 5 |
| 1 | 5 |
| 3 | 6 |
+-----------+--------+
有了这些信息,我们就可以想象出关系图了。如下所示;
问题是:我怎样才能通过提供任何人的 ID 来获取所有有联系的人。
例如;
- 当我给 ID=1 时,它应该返回给我 1,2,3,4,5,6。(顺序不重要)
- 同样,当我给 ID=6 时,它应该返回给我 1,2,3,4,5,6。(顺序不重要)
- 同样,当我给 ID=7 时,它应该返回给我 7。
请注意:人物节点的关系(边)可能在图的任何地方都有循环。上面的示例显示了我的一小部分数据。我是说;人和婚姻表可能包含数千行,我们不知道在哪里可能会出现循环。
在 :
中提出的类似问题PostgreSQL SQL query for traversing an entire undirected graph and returning all edges found http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=118319
但我无法编写有效的 SQL。提前致谢。 我正在使用 SQL Server。
【问题讨论】:
-
您使用的是 SQL Server Azure SQL 数据库还是 SQL Server 2017?两者都有(有限的)图表功能。
-
我尝试了 SQL Server 2017 但我无法编写解决方案查询。
-
使用 Neo4j :)。或者,编写一个 sproc,跟踪您跨越的每个节点 ID,对于您尝试访问的每个节点,首先检查您是否已经处理过它(我之前做过这个,它是当时防止循环处理的唯一方法......大约 2 年前,在 RDBM 中的任何特定于图形的功能之前)
标签: sql-server recursion graph graph-databases genealogy