【问题标题】:recursive sql search递归sql搜索
【发布时间】:2017-05-12 15:51:58
【问题描述】:

我正在寻找一个查询,我可以在其中按组要求数据。示例:

table group
-uID-|-parentID-|-someData-
0    |  0       | foo
1    |  0       | bar
2    |  1       | foobar
3    |  2       | test
4    |  2       | demo

父 ID 指向父组中的 uID。

例如:当我想要第 3 组时,我只会返回“测试”。当我请求第 1 组时,结果将是:bar、foobar、test 和 demo。 所以我必须获取所有的行,其中 parentID 与我正在搜索的 uID 匹配。

为了更好地理解,这是架构图:

如果我正在寻找第 1 组,我会得到它以及所有子组 2、3 和 4。

谢谢。

【问题讨论】:

  • 我正在使用 sqlite。
  • 您能否更详细地解释一下如何从请求组 1 中获得 bar、foobar、test 和 demo?
  • 这是一个关于 SQLite 中递归查询示例的问题:stackoverflow.com/questions/7456957/…
  • @BobbyA 我添加了一张图片以便更好地理解

标签: sql sqlite


【解决方案1】:

在 sqlite 中,我们可以使用 recursive CTE 来实现这一点。

WITH RECURSIVE reccte AS
(
    SELECT 
        uid as initialID,
        uID,
        parentID,
        someData,
        1 as depth 
    FROM table
    WHERE uID = 1 /*starting point for recursive stuff*/

    UNION ALL

    /*Recursive statement*/
    SELECT
        reccte.initialID,
        t1.uID,
        t1.parentID,
        someData,
        depth + 1
    FROM
        reccte
        INNER JOIN table as t1 ON
            recCTE.uID = t1.parentID /*joining up the parent*/
    WHERE depth < 15 /*keep from endless loops*/
)

/*Select all the someData's that resulted from the recursive lookup*/
SELECT someData FROM recCTE;

【讨论】:

  • 没有depth,就不会有无限循环的危险。
  • 我对 sqlite 不熟悉。如果 OP 的实际数据可能不干净,它是否有一些递归查询机制来防止无休止的循环?
  • UNION 删除所有重复的行。 (如果不需要,UNION ALL 会更有效。)
  • 请再次查看我的问题。我添加了一张图片。谢谢
  • @tom_tom 这应该会根据您图片的层次结构为您提供您正在寻找的输出。 Child | Parent | attribute 表很常见,递归 CTE 是我们通常解决这些问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2014-01-10
  • 2019-03-12
  • 2016-11-13
  • 2015-04-12
相关资源
最近更新 更多