Tôi có ví dụ CTE làm việc này.
Tôi có thể chọn tất cả cha mẹ lớn và tất cả trẻ em.
Nhưng làm thế nào tôi có thể chọn tất cả cha mẹ lớn và tất cả trẻ em trong một tuyên bố?
Trong ví dụ này, tôi muốn Ông, Cha, Con làm đầu ra nếu tôi cho "Cha" làm đầu vào.
Tôi sử dụng PostgreSQL. Nhưng tôi nghĩ câu hỏi này phải là SQL chuẩn.
Vui lòng sửa cho tôi nếu tôi sử dụng cú pháp cụ thể của PostgreSQL.
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
Cập nhật
Trên đây là một ví dụ làm việc đơn giản hóa. Cây có thể sâu đến 100 cấp. Có thể có một số cấp độ của tổ tiên ở trên "Cha" và một số cấp độ con cháu bên dưới. Tôi muốn tất cả tổ tiên và tất cả con cháu.