2016-07-19 11 views
4

Im Moment entwickle ich eine Anwendung, die eine Dateihierarchie (Ordner und Dateien werden nicht unterschieden) in einer Datenbank speichern muss. Für diese erstellte folgende Tabelle:SQLite rekursive Abfrage zum Zurückgeben des Dateipfads

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

Das übergeordnete Feld ist ein fremd tbl_files selbst. Das Hauptverzeichnis hat die ID root. Ich möchte jetzt den Pfad zu einer Datei abrufen, bis das Stammverzeichnis erreicht ist. Ich dachte daran, dies mit einer rekursiven SQL-Abfrage zu tun, aber ich weiß nicht, wie ich den Pfad von der Datenbank "zurückgeben" soll.

Ist eine rekursive Abfrage in Ordnung oder ist es eine schlechte Vorgehensweise? Und wie soll ich den Pfad mit dieser Abfrage "generieren"?

Antwort

4

Um die Pfadeinträge zu erhalten, verwenden Sie recursive CTE. Um die Namen zu kombinieren, verwenden 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; 
+0

Große Ihnen danken. Kannst du bitte etwas über die Effizienz dieser Abfrage-Methode sagen? – Cilenco

+0

Es ist genauso effizient wie wenn Sie die Einträge manuell nachschlagen würden. Aber warum kümmert es dich? Müssen Sie Millionen von Pfaden pro Sekunde bewältigen? –

+0

Okay danke. Ich habe so etwas noch nie benutzt und dachte über die rekursive Stackgröße nach, aber ich denke, für meine Fragen ist das nicht so wichtig. – Cilenco