zondag 29 december 2024

PostgreSQL: recursive query

Suppose you have the following sql tables:
Table "group"
id: int8
name: varchar

Table "group_member"
id: int8
group_id: int8
member_user_id: int8
member_group_id: int8


The column member_group_id is filled when you have a group
that is part of the group identified with group_id.

Suppose you want to determine all groups that are part of a 
specific group. You need a recursive query for that:

-- Met deze query willen we alle groepen bepalen die in onze
-- groep zitten.
-- Als een groep lid is van onze groep, dan zijn dat ook 
-- users die we moeten ophalen.
-- we moeten dus de huidige groep en de groepen die lid 
-- zijn van onze groep bepalen. En dat recursief.
with recursive groups AS (
  select
    g.id as group_id,
    gm.member_group_id as member_group_id
  from "group" g
  -- welke groepen zijn members van de huidige groep?
  left outer join group_member gm on gm.group_id = g.id and gm.member_group_id is not null
  where g.id = specific_group_id
  --  
  union
  --
  select
    g.id as group_id,
    gm.member_group_id as member_group_id
  from "group" g
  -- welke groepen zijn members van de huidige groep?
  left outer join group_member gm on gm.group_id = g.id and gm.member_group_id is not null
  -- we doen de query vanuit de member_group_id van het resultaat van de recursie
  inner join groups rg on rg.member_group_id = g.id
)
select distinct(group_id) from groups;

Geen opmerkingen:

Een reactie posten