【问题标题】:SQLite recursive query to return file pathSQLite递归查询返回文件路径
【发布时间】:2016-07-19 17:44:49
【问题描述】:

目前我正在开发一个应用程序,它必须在数据库中存储文件层次结构(不区分文件夹和文件)。为此创建了下表:

tbl_files
----------------------------------
|   id   |   name   |   parent   |
----------------------------------

父字段对于tbl_files 本身来说是陌生的。主目录的 ID 为 root。我现在想获取文件的路径,直到到达根目录。我想过用递归 SQL 查询来做到这一点,但我不知道如何从数据库中“返回”路径。

递归查询是好的还是不好的做法?我应该如何用这个查询“生成”路径?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    要获取路径条目,请使用recursive CTE。 要组合名称,请使用group_concat()

    WITH RECURSIVE path(level, name, parent) AS (
        SELECT 0, name, parent
        FROM tbl_files
        WHERE id = @MyFileID
        UNION ALL
        SELECT path.level + 1,
               tbl_files.name,
               tbl_files.parent
        FROM tbl_files
        JOIN path ON tbl_files.id = path.parent
    ),
    path_from_root AS (
        SELECT name
        FROM path
        ORDER BY level DESC
    )
    SELECT group_concat(name, '/')
    FROM path_from_root;
    

    【讨论】:

    • 非常感谢您。能否也请您谈谈这种查询方法的效率?
    • 这就像您手动查找条目一样有效。但你为什么在乎;您需要每秒处理数百万条路径吗?
    • 好的,谢谢。我以前从未使用过这样的东西,我考虑过递归堆栈大小等等,但我认为这对我的查询来说并不那么重要。
    • 如果您只选择名称,path 中怎么会有 parent 列?对我来说,这个查询会引发一个适当的错误:Error: no such column: path.parent.
    • @mınxomaτ 糟糕,该列确实应该在path 中。
    猜你喜欢
    • 2012-03-14
    • 2019-05-27
    • 2021-04-21
    • 2016-08-03
    • 2019-12-23
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多