2

如果我的数据结构是这样的

parentA
-------parentAA
--------------parentAAA
---------------------childA

如果我能得到“childA.name”。我怎样才能知道所有父级名称直到顶层。所以会是这样 >parentA/parentAA/parentAAA/childA

做这个的最好方式是什么 ?

我正在使用 SQLite 和 JAVA/android .. 感谢广告。

_ _ __ _ __ _ ___编辑

好的,谢谢你们所有人。所以我只是通过重复“选择查询”来实现。BOTTOM-UP 这是我创建的方法

public String getPath(int id, int type) {
        StringBuilder pathBuilder = new StringBuilder();
        String sql = null;
        int parentId = 0;

        if (id == 0) {
            pathBuilder.insert(0, "/root/");
            return pathBuilder.toString();
        }

        if (type == LayerManagementActivity.PARENT) {
            do {
                sql = "SELECT id, name, parent_id from parents_table where id="
                        + id;
                Cursor c = mDatabase.rawQuery(sql, null);
                if (c.moveToFirst()) {
                    parentId = c.getInt(2);
                    id = c.getInt(0);
                    pathBuilder.insert(0, "/" + c.getString(1));
                    c.close();
                }
                id = parentId;
            } while (parentId != 0);

            pathBuilder.insert(0, "/root");
            pathBuilder.append("/");

        } else if (type == LayerManagementActivity.CHILD) {
            sql = "SELECT id, name, folder_id FROM childs_table WHERE id=" + id;
            Cursor c = mDatabase.rawQuery(sql, null);
            if (c.moveToFirst()) {
                pathBuilder.append(c.getString(1));
                id = c.getInt(0);
                int folderId = c.getInt(2);
                String path = getPath(folderId, LayerManagementActivity.PARENT);
                pathBuilder.insert(0, path);
            }
            c.close();
        }
        Log.d("crumb", pathBuilder.toString());
        return pathBuilder.toString();
    }
4

4 回答 4

9

在 2014 年 2 月 3 日的这个SQLite 版本 3.8.3中,添加了对 CTE 的支持。这是WITH 子句 示例的文档:

WITH RECURSIVE
cnt(x) AS (
 SELECT 1
 UNION ALL
 SELECT x+1 FROM cnt
  LIMIT 1000000
)
SELECT x FROM cnt;
于 2014-03-06T12:25:37.333 回答
2

我有一个名为 project 的表,其中有一列名为 rates。rate 列是一个包含 JSON 数组的字符串。要将此字符串拆分为可在 IN 语句中使用以从相关表中获取行的行,我将其用于 IN 部分

WITH
 split(s, p) AS (
 SELECT substr(printf("%s%s", ss, ","), instr(ss, ",")+1), trim(substr(ss, 0, instr(ss, ","))) from ( select replace(replace(rates,"[",""), "]","") ss from project where rowid = 1)
 UNION ALL
 SELECT substr(s, instr(s, ",")+1), trim(substr(s, 0, instr(s, ","))) FROM split
 where p!=""
 )
 select p from split where p!=""
于 2014-08-27T19:47:40.243 回答
1

您可以使用嵌套集模型。嵌套集有很大的优势,它们可以在大多数 SQL 引擎中使用简单的非递归 SQL 查询来实现。

于 2013-07-08T08:29:41.250 回答
0

SQLite 不支持递归 CTE(或者根本不支持 CTE)

SQLite 中没有 WITH。由于您不知道它有多深,因此您不能使用标准的 JOIN 技巧来伪造递归 CTE。您必须以艰难的方式做到这一点并在您的客户端代码中实现递归:

  • 获取初始行和子部件 ID。
  • 获取子部件的行和子部件 ID。
  • 重复直到什么都没有回来。
于 2013-07-08T05:31:54.693 回答