Ich habe dieses funktionierende CTE-Beispiel.
Ich kann alle Großeltern und alle Kinder auswählen.
Aber wie kann ich alle Großeltern und alle Kinder in einer Aussage auswählen?
In diesem Beispiel möchte ich Großvater, Vater, Sohn als Ausgabe, wenn ich "Vater" als Eingabe gebe.
Ich benutze PostgreSQL. Aber ich denke, diese Frage sollte Standard-SQL sein.
Bitte korrigieren Sie mich, wenn ich PostgreSQL-spezifische Syntax verwende.
DROP table if exists tree;
CREATE TABLE tree (
id SERIAL PRIMARY KEY,
name character varying(64) NOT NULL,
parent_id integer REFERENCES tree NULL
);
insert into tree values (1, 'Grandfather', NULL);
insert into tree values (2, 'Father', 1);
insert into tree values (3, 'Son', 2);
-- -------------------------------------
-- Getting all children works
WITH RECURSIVE rec (id) as
(
SELECT tree.id, tree.name from tree where name='Father'
UNION ALL
SELECT tree.id, tree.name from rec, tree where tree.parent_id = rec.id
)
SELECT *
FROM rec;
-- Result:
-- id | name
-- ----+--------
-- 2 | Father
-- 3 | Son
-- -------------------------------------
-- Getting all parents works
WITH RECURSIVE rec (id) as
(
SELECT tree.id, tree.name, tree.parent_id from tree where name='Father'
UNION ALL
SELECT tree.id, tree.name, tree.parent_id from rec, tree where tree.id = rec.parent_id
)
SELECT id, name
FROM rec;
-- Result
-- id | name
-- ----+-------------
-- 2 | Father
-- 1 | Grandfather
Aktualisieren
Oben ist ein vereinfachtes Arbeitsbeispiel. Der Baum kann bis zu 100 Level tief sein. Es kann mehrere Ebenen von Vorfahren über "Vater" und mehrere Ebenen von Nachkommen unter "Vater" geben. Ich möchte alle Vorfahren und alle Nachkommen.
postgresql
cte
recursive
guettli
quelle
quelle
Antworten:
Wenn Sie alle Vorfahren und alle Nachkommen möchten, können Sie die beiden Abfragen in einer kombinieren. Verwenden Sie die beiden CTEs und dann eine einfache
UNION
:Wenn wir oben keine Fehler haben, können wir sie verbessern:
UNION
in,UNION ALL
indem Sie den / die Startknoten nur in einen der CTEs einfügen.JOIN .. ON
anstelle der impliziten Verknüpfungen.Die Abfrage lautet:
quelle