Wie man rekursive Abfragen in SQLite?
wenn meine Daten-Struktur ist, wie dies
parentA
-------parentAA
--------------parentAAA
---------------------childA
wenn ich "childA.Namen" . wie kann ich wissen, daß Sie alle den Namen des übergeordneten, bis die oberste Ebene.
so wird es sein, wie diese > parentA/parentAA/parentAAA/childA
was ist der beste Weg, dies zu tun ?
arbeite ich mit SQLite und JAVA/android .. danke in adv.
____________ EDIT
Okay Jungs, danke für alle u . also habe ich es nur wiederholen, die "select-Abfrage". BOTTOM-UP dies ist die Methode, die ich erstellen
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();
}
- Pls nicht verwenden rekursive Funktion, Ihre macht, Ihre Anwendungs-performance nach unten
- SQLite unterstützt keine rekursiven Abfragen direkt (kein CTE oder VERBINDEN) - es müssen so viele selects (wie joins oder in mehreren Abfragen) pro Ebene in einem Ansatz verwendet, die eine Eltern-Kind-Beziehung verknüpfen. Andere Ansätze, die nicht brauchen Rekursion zur Beantwortung dieser Abfrage gehören materialisierte Pfade und verschachtelte Sätze (Suchbegriffe).
- Rekursive Funktionen sind oft feine (und SQLite hat eine sehr geringe Latenz) - was wirklich tötet Leistung nicht Indizes über weite Sätze; oder ersatzweise zu verwenden, legen Sie Verknüpfungen und Indizes, wie: z.B., wenn jeder Knoten wurde gebeten, über alle Eltern, die es hatte, und einige andere SQL-Informationen, die benötigt werden, gesammelt auf dieser Basis - das könnte sehr eklig! Aber für eine einzelne Abfrage (zumindest so vorgestellt), nicht so schlecht.
- okay, also wenn wir nicht verwenden können, rekursive Funktion in sqlite, was sind die alternativen ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
SQLite nicht unterstützt rekursive Allgemeine Tabellenausdrücke (oder CTEs an alle, für diese Angelegenheit),
es ist nicht MIT in der SQLite. Da Sie nicht wissen, wie tief es geht, Sie können nicht verwenden Sie den standard-JOIN-trick, um gefälschte der rekursive CTE. Sie haben, um es zu tun die harte Weise, und implementieren Sie die Rekursion in Ihrem client-code:
In diesem SQLite Version 3.8.3 On 2014-02-03 Hinzugefügt wurde die Unterstützung für die Allgemeine Tabellenausdrücke. Hier ist die Dokumentation MIT Klausel
Beispiel:
Ich habe eine Tabelle namens Projekt mit einer Spalte mit dem Namen Preisen.
Die Preise der Spalte ist ein string, der hält ein JSON-array.
Aufgeteilt ist dieser string in Zeilen, die ich verwenden können, um eine Aussage zu bekommen, die Zeilen aus der verwandten Tabelle, ich benutze diese für die IN Teil
Können Sie nested set model. Nested sets haben den großen Vorteil, dass Sie umgesetzt werden können, in den meisten SQL-Motoren mit einfachen, nicht-rekursiven SQL-Abfragen.