sql - 如何找到数据库条目之间的循环?

标签 sql database sqlite

我有一个如下的数据库表:

column 1 | column 2

x | Y

y | z

z | x

所以基本上是 x->y->z->x。

现在我必须检测数据库中的此类条目。一种解决方案是采用这些条目并在内存中制作图形,然后使用循环查找算法检测循环。如果可能的话,我宁愿使用 SQL 查询。

最佳答案

SQLite 不支持递归查询,所以你能做的最好的事情就是使用自连接来检测固定长度的循环。您无法检测任意长度的循环。

这是一个找到长度为 2 的循环的连接示例,就像您在问题中展示的示例一样。

SELECT ...
FROM t AS t0
JOIN t AS t1 ON t0.column2 = t1.column1
JOIN t AS t2 ON t1.column2 = t2.column1
WHERE t2.column2 = t0.column1

回复你的评论:

如果您需要检测任意长度的循环,我只能建议您必须存储比直接链接更多的内容。您还必须存储 transitive closure ,即通过图表的每条路径。这是提高搜索效率的最佳方式。当然,这样做需要更多的存储空间,但这是你的权衡。而且它占用的额外空间比您想象的要少。

我为树做了一个传递闭包设计,但没有为无环图设计。请参阅我对 What is the most efficient/elegant way to parse a flat table into a tree? 的回答或者我的介绍 Models for Hierarchical Data with SQL .

关于sql - 如何找到数据库条目之间的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13768046/

相关文章:

sql - 从 MySQL 中的多个表中选择

python - 如何将 Python 复合键、值字典写入数据库?

java - com.microsoft.sqlserver.jdbc.SQLServerException : Conversion failed when converting the nvarchar value '123.0' to data type int

mysql - 将多个阅读日期分组为簇,该年的第 N 次阅读

php - 坚持将我的表单保存到数据库

php - PDO执行问题

android - Realm 在第一次调用时崩溃。如果用于打开同一个文件,配置不能不同

ios - 在 MVC 和存储库 iOS 中开发的良好实践

iOS SQLite : Insert statement fails, 看不到为什么

sql - 如何在R中模拟SQL等级函数?