Postgres с рекурсивным запросом с несколькими таблицами - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно рекурсивно найти все дочерние элементы родительского элемента в postgres.

У меня есть такая структура таблицы:

items
-----
id

modifiers
---------
id

item_modifiers
--------------
id
item_id
modifier_id

modifier_items
--------------
id
item_id
modifier_id

Элемент has_many child_modifiers through item_modifiers Модификатор has_many child_items до modifier_items.

Так что в основном иерархия выглядит так: item -> item_modifiers -> modifier -> modifier_items -> item

У меня есть это, но не работает. Не уверен, что изменить.

    WITH RECURSIVE search_tree(id, path) AS (
      SELECT "items".id, ARRAY["items".id]
      FROM items
      WHERE "items".id ='#{top_level_item.id}'
    UNION ALL
      SELECT #{table_name}.id, path || #{table_name}.id
      FROM search_tree
      INNER JOIN modifier_items
      ON "search_tree".id = "modifier_items".item_id
      WHERE "modifier_items".modifier_id IN (
        SELECT "modifiers".id
        FROM modifiers
        INNER JOIN item_modifiers ON "modifiers".id = "item_modifiers".modifier_id
        WHERE "item_modifiers".item_id = "search_tree".id
      )
      WHERE NOT #{table_name}.id = ANY(path)
  )
  SELECT id FROM search_tree ORDER BY path

Есть идеи?

...