Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 确定特定条目在分层数据库中是否有子项_Sql_Postgresql_Hierarchy_Recursive Query - Fatal编程技术网

Sql 确定特定条目在分层数据库中是否有子项

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

我正在为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, 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.删除子项,与我在编辑中所做的不同。)技术上正确,但我希望此子项在整个表上生成一个巨大的合并联接。(请注意,并不是说我希望从自己的答案中看到的整个表格上的嵌套循环更好;只是我们正在讨论哪种感染鼠疫或霍乱更好。)