У меня есть таблица с отношением ManyToMany к себе.Итак, в моей базе данных H2 есть две таблицы:
supporting_asset: supporting_asset_dependencies:
id | provided_csc dependencies_id | supporting_assets_id
------------------ ---------------------------------------
1 | A1 1 | 2
2 | A3 1 | 3
3 | A2
У меня есть вычисляемый атрибут minCSC, и для его вычисления я использую аннотацию @Formula:
@Formula(value="(Select min(sa.provided_csc) from supporting_asset_dependencies sad right join supporting_asset sa on sa.id = sad.dependencies_id where sad.supporting_assets_id = id group by id)")
Это работаетхорошо, но зависимые активы могут иметь собственные зависимости.С этим я получаю многоуровневое дерево зависимостей.Моя цель - получить минимальное значение csc из этого дерева.
Я пытался:
WITH RECURSIVE tree(id, provided_csc, dep_id)
AS (SELECT sa.id, sa.provided_csc, sad.supporting_assets_id
FROM supporting_asset_dependencies AS sad
JOIN supporting_asset AS sa
ON sa.id=sad.dependencies_id
WHERE sad.supporting_assets_id=2
UNION ALL
SELECT child.id, child.provided_csc, childd.supporting_assets_id
FROM supporting_asset_dependencies AS childd
JOIN supporting_asset AS child
ON child.id=childd.dependencies_id
JOIN tree ON childd.supporting_assets_id=tree.id )
SELECT min(provided_csc)
FROM tree
, но я получаю «Синтаксическая ошибка в выражении SQL».Кажется, что формула вычисляется в:
(SUPPORTING2_.WITH[*] TREE(SUPPORTING2_.ID, SUPPORTING2_.PROVIDED_CSC, SUPPORTING2_.DEP_ID) AS ( ..
.. ) SELECT MIN(SUPPORTING2_.PROVIDED_CSC) FROM TREE) AS FORMULA0_1_,
Похоже, она не знает команду 'with recursive' и пытается найти ее как поле таблицы.
Как сделатьМне нужно изменить запрос, чтобы он работал, или есть другой способ добиться того, чего я хочу?
--- ОБНОВЛЕНИЕ --- Я немного изменил запрос и на DB Fiddle это работает для БД SQLite.Это также работает в веб-консоли h2.