我正在为一个论坛开发一个数据库,包含线程和消息。线程以没有parent_id的消息开始;答复是带有parent_id的消息。
我有张桌子准备留言。每个项目引用同一表中的项,以便将它们作为父-子关系。
create table messages(
id int,
title text,
content text,
parent_id int
);
现在,我在表中填充了一些数据:
insert into messages values
(1, 'One', 'First thread main post', null), -- First thr
我有递归查询来检索给定人的所有子级
WITH RECURSIVE recursetree(id, parent_id) AS (
SELECT id, parent_id FROM tree WHERE parent_id = 0
UNION
SELECT t.id, t.parent_id
FROM tree t
JOIN recursetree rt ON rt.id = t.parent_id
)
SELECT * FROM recursetree;
如您所见,我指定要检索的列列表。但是我想使用SELECT * (我在实表中有很多列,将来可以修改)
我有一个有用的CTE例子。
我可以选择所有的父母和孩子。
但我如何在一份声明中选择所有的祖父母和所有的孩子呢?
在这个例子中,如果我给“父亲”作为输入,我想要祖父、父亲、儿子作为输出。
我用PostgreSQL。但我认为这个问题应该是标准SQL。
如果我使用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
包含以下PostgreSQL 9.2.2表:
id | parent_id
--------+----------
body | null
head | body
mouth | head
eye | head
tooth | mouth
tongue | mouth
sclera | eye
cornea | eye
我需要一个输出,其中列出了每个非父子节点的所有直接间接父节点,如下所示:
tooth mouth
tooth head
tooth body
tongue mouth
tongue head
tongue body
我的第一个查询返回前10条注释,它们的parent_id为空 SELECT comment_id FROM comments WHERE thread_id = $1
AND parent_id is NULL
ORDER BY upvoted DESC FETCH FIRST 10 ROW ONLY 我如何使用每个评论id来执行递归查询? 我当前的方法是将返回的comment_id存储在一个数组中 [1, 2, 3, 4, 10, 14, 15, 18, 19, 20] ,然后使用for循环对每个id执行递归查询。 var query =
`With RECURSIVE cte A
如何验证直到parent_id为空(根)的父项。我如何逐级验证父级,从给定的底层叶子开始,直到到达根?
伪代码:
Select *
from parameter_node
Where name = 'test1111'
AND parent.id = 3
AND parent.parent.id= 2
AND parent.parent.parent.id=1
AND parent.parent.parent.parent.id IS NULL
我在postgres 9.3.5中有一个表,看起来像这样:
CREATE TABLE customer_area_node
(
id bigserial NOT NULL,
customer_id integer NOT NULL,
parent_id bigint,
name text,
description text,
CONSTRAINT customer_area_node_pkey PRIMARY KEY (id)
)
我用以下方式查询:
WITH RECURSIVE c AS (
SELECT *, 0 as level, name as