diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index ee50301394b0f12444bb06262b1bf17ec0a22d62..e928312cf7355f28c6ea81ca461a4a275377de8c 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -506,6 +506,17 @@ class Group(SchoolTermRelatedExtensibleModel):
     def child_groups_recursive(self) -> CTEQuerySet:
         """Get all child groups recursively."""
 
+        def _make_cte(cte):
+            Through = self.child_groups.through
+            return (
+                Through.objects.values("from_group_id")
+                .filter(to_group=self)
+                .union(cte.join(Through, to_group=cte.col.from_group_id), all=True)
+            )
+
+        cte = With.recursive(_make_cte)
+        return cte.join(Group, id=cte.col.from_group_id).with_cte(cte)
+
     def __str__(self) -> str:
         if self.school_term:
             return f"{self.name} ({self.short_name}) ({self.school_term})"