Sql 确定特定条目在分层数据库中是否有子项
我正在为psql中的层次表进行递归查询。虽然我能够生成一个有序的层次列表,但我不知道如何确定父母是否有子女 我现在的代码是:Sql 确定特定条目在分层数据库中是否有子项,sql,postgresql,hierarchy,recursive-query,Sql,Postgresql,Hierarchy,Recursive Query,我正在为psql中的层次表进行递归查询。虽然我能够生成一个有序的层次列表,但我不知道如何确定父母是否有子女 我现在的代码是: WITH RECURSIVE q AS ( SELECT h, 1 AS level, ARRAY[ordering] AS ordered_path, ARRAY[id] AS breadcrumb FROM report h WHERE parent IS NULL UNION ALL SELECT hi, q.level + 1 AS level
WITH RECURSIVE q AS (
SELECT h, 1 AS level, ARRAY[ordering] AS ordered_path, ARRAY[id] AS breadcrumb
FROM report h
WHERE parent IS NULL
UNION ALL
SELECT hi, q.level + 1 AS level, ordered_path || ordering, breadcrumb || id FROM q
JOIN report hi ON hi.parent = (q.h).id )
SELECT (q.h).id, (q.h).parent, (q.h).name, array_to_json(breadcrumb) AS breadcrumbs,
row_number() OVER (order by ordered_path) AS flat_order
FROM q
ORDER BY ordered_path
这将生成下表:
id | parent | name | ordering | trail | rownum
----+--------+-----------------------+----------+--------------+--------
1 | | Entry 1 | 1 | [1] | 1
2 | 1 | Entry 2 | 1 | [1,2] | 2
15 | 2 | Entry 3 | 1 | [1,2,15] | 3
159 | 2 | Entry 4 | 2 | [1,2,159] | 4
16 | 2 | Entry 5 | 3 | [1,2,16] | 5
基本上,我想要一个列,显示特定条目是否有子条目。在本例中,条目5没有子项
原始表格的格式为:
id | name | type | parent | ordering
-----+-----------------------------------------+---------+--------+----------
186 | Entry 1 | page | 172 | 23
154 | Entry 2 | page | 63 | 3
169 | Entry 3 | page | 163 | 3
谢谢 可以使用相关子查询作为额外字段:
exists (select 1 from report where parent = q.id) as has_children
这不一定是最有效的——尽管如此,考虑到这个问题,我想不出比这更好的了。但是它会起作用。下面的sql fill找到子对象并计算您可以通过使用case语句更改输出方式。我测试了代码,它似乎起作用了
select x.Col1, count(y.Col1) as child from Table1 x
inner join Table2 y on x.Col1 = y.Col1
group by x.Col1
为什么条目3和条目4没有孩子,而条目5却没有?有趣的是,我想知道我会受到多大的表演冲击。当然,这是一个目录-最多100个条目,所以它不应该是一个问题。我应该在查询中的何处放置此项?尽可能晚(即,在您的示例中,在
row_number()
之后)。如果您只选择了少数几行,它将执行OK。如果不是的话,看看瓜塔姆的答案。它可能会产生一个合并连接计划,但如果你给Postgres大量的workmem(以避免交换),它应该会更快。嗯,我在row_number()后面添加了子查询,但似乎没有看到任何东西,是的-性能不是问题,但我实际上得到了相反的结果(例如,有子项的标记为f,没有子项的标记为t)。(Double oops.删除子项,与我在编辑中所做的不同。)技术上正确,但我希望此子项在整个表上生成一个巨大的合并联接。(请注意,并不是说我希望从自己的答案中看到的整个表格上的嵌套循环更好;只是我们正在讨论哪种感染鼠疫或霍乱更好。)