我有一个如下数据库表:
第1栏|第2栏
x | ÿ
y | ž
z | X
所以基本上是x-> y-> z-> x。
现在我必须在数据库中检测这些条目。一种解决方案可以是获取这些条目并在存储器中制作图形,然后使用循环查找算法检测循环。如果可能的话,我宁愿用SQL查询来做。
答案 0 :(得分:1)
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的回答。