2

私のデータ構造がこのような場合

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

「childA.name」を取得できれば。最上位までのすべての親の名前を知るにはどうすればよいですか。だからこうなる >parentA/parentAA/parentAAA/childA

これを行う最良の方法は何ですか?

私は SQLite と Java/Android を使用しています。adv に感謝します。

__ _ __ _ __ _ ___編集

皆さん、ありがとうございました。だから、「選択クエリ」を繰り返して作るだけです。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

このSQLite リリース 3.8.3 では、2014 年 2 月 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

レートという名前の列を持つプロジェクトというテーブルがあります。レート列は、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 に答える
0

SQLite は再帰的な CTE をサポートしていません (または、CTE をまったくサポートしていません)

SQLite には WITH はありません。どのくらい深くなるかわからないため、標準の JOIN トリックを使用して再帰 CTE を偽造することはできません。難しい方法でクライアント コードに再帰を実装する必要があります。

  • 最初の行とサブパーツ ID を取得します。
  • サブパーツの行とサブパーツ ID を取得します。
  • 何も返ってこなくなるまで繰り返します。
于 2013-07-08T05:31:54.693 に答える