Ich habe das folgende Schema für die Tags Tabelle:Adjazenzliste zu JSON Graph mit Postgres
CREATE TABLE tags (
id integer NOT NULL,
name character varying(255) NOT NULL,
parent_id integer
);
Ich brauche eine Abfrage zu erstellen, die folgende Struktur zurück (hier als yaml zur besseren Lesbarkeit dargestellt):
- name: Ciencia
parent_id:
id: 7
children:
- name: Química
parent_id: 7
id: 9
children: []
- name: Biología
parent_id: 7
id: 8
children:
- name: Botánica
parent_id: 8
id: 19
children: []
- name: Etología
parent_id: 8
id: 18
children: []
nach einigem Versuch und Irrtum und auf der Suche nach ähnlichen Fragen in SO habe ich kam mit dieser Abfrage nach oben:
WITH RECURSIVE tagtree AS (
SELECT tags.name, tags.parent_id, tags.id, json '[]' children
FROM tags
WHERE NOT EXISTS (SELECT 1 FROM tags tt WHERE tt.parent_id = tags.id)
UNION ALL
SELECT (tags).name, (tags).parent_id, (tags).id, array_to_json(array_agg(tagtree)) children FROM (
SELECT tags, tagtree
FROM tagtree
JOIN tags ON tagtree.parent_id = tags.id
) v
GROUP BY v.tags
)
SELECT array_to_json(array_agg(tagtree)) json
FROM tagtree
WHERE parent_id IS NULL
Aber es gibt die folgenden Ergebnisse, wenn zu yaml umgewandelt:
- name: Ciencia
parent_id:
id: 7
children:
- name: Química
parent_id: 7
id: 9
children: []
- name: Ciencia
parent_id:
id: 7
children:
- name: Biología
parent_id: 7
id: 8
children:
- name: Botánica
parent_id: 8
id: 19
children: []
- name: Etología
parent_id: 8
id: 18
children: []
Der Wurzelknoten dupliziert. Ich könnte die Ergebnisse zu dem erwarteten Ergebnis in meinem App-Code zusammenführen, aber ich fühle, dass ich nah bin und es konnte alles von PG getan werden.
Hier ist ein Beispiel mit SQL Fiddle: http://sqlfiddle.com/#!15/1846e/1/0
Erwartete Ausgabe: https://gist.github.com/maca/e7002eb10f36fcdbc51b
tatsächliche Ausgang: https://gist.github.com/maca/78e84fb7c05ff23f07f4
Können Sie einige Beispieldatensätze posten? – mlinth
Ich habe ein SQL Fiddle Beispiel gepostet und enthält die erwarteten und tatsächlichen Ausgaben. – Macario
Danke für die Daten - vorzüglich strukturierte Frage ... ich hatte es versucht, konnte es aber nicht lösen :-(Aber hier ist ein Link, der dir vielleicht weiterhelfen könnte ... http://bender.io/2013/09/22/Returning-Hierarchical-Data-in-single-SQL-Query/ – mlinth