Postgresql递归查询

rvpgvaaj  于 2022-12-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(170)

我有一个外键自相关的表,但不知道如何接收满足条件的第一个子代或后代。my_table结构为:
| 身份证|父代标识|类型|
| - ------| - ------| - ------|
| 1个|零|联合|
| 第二章|1个|群|
| 三个|第二章|群|
| 四个|三个|离开|
| 五个|1个|离开|
| 六个|五个|单位|
| 七|1个|单位|
对于id 1(union),我应该接收所有直接子节点或第一个子节点,不包括第一个子节点和union之间的所有组。
| 身份证|类型|
| - ------| - ------|
| 四个|离开|
| 五个|离开|
| 七|单位|
id为4,因为它通过id为3的组以及id为2和5的组连接到联合,因为它直接连接到联合。
我试着用递归部分的条件来写递归查询:当parent_id = 1或parent_type ="离开"但未产生预期结果时

with recursive cte AS (
  select b.id, p.type_id
  from my_table b 
  join my_table p on p.id = b.parent_id
  where b.id = 1

  union
 
  select c.id, cte.type_id      
  from my_table c
  join cte on cte.id = c.parent_id
  where c.parent_id = 1 or cte.type_id = 'group'
 )
4zcjmb1e

4zcjmb1e1#

以下是我的解读:
1.如果type='group',则将idparent_id视为同一组

  1. id#1id#2在同一组中,它们相等
  2. id#2id#3在同一组中,它们相等
  3. id#1id#2id#3在同一组中
    如果上面的结果是正确的,那么你需要得到id#1的组的所有第一个后代。
    1.使用id#1获取同一组中的所有id
    1.获取上述组的所有第一个后代(type not in ('union', 'group')

with recursive cte_group as (
select 1 as id
union all
select m.id
  from my_table m
  join cte_group g
    on m.parent_id = g.id
   and m.type = 'group')
select mt.id, 
       mt.type
  from my_table mt
  join cte_group cg
    on mt.parent_id = cg.id
   and mt.type not in ('union','group');

结果:

id|type  |
--+------+
 4|depart|
 5|depart|
 7|unit  |
tyu7yeag

tyu7yeag2#

听起来好像您想从id为1的行开始,然后得到它的子行,接着递归地处理类型为group的行。

WITH RECURSIVE tree AS (
  SELECT b.id, b.type, TRUE AS skip
  FROM my_table b
  WHERE id = 1
UNION ALL
  SELECT c.id, c.type, (c.type = 'group') AS skip
  FROM my_table c
  JOIN tree p ON c.parent_id = p.id AND p.skip
)
SELECT id, type
FROM tree
WHERE NOT skip

相关问题