CREATE VIEW queryCurrentActiveVersions as SELECT DISTINCT q.id as queryId, coalesce( (FIRST_VALUE(av.versionId) OVER (PARTITION BY q.id ORDER BY av.id DESC)), 0 )::int as activeVersion FROM queries AS q LEFT JOIN queryActiveVersions as av on av.queryId = q.id; CREATE VIEW queryLatestVersions as SELECT q.id as queryId, coalesce(max(v.id), 0)::int as latestVersion FROM queries AS q LEFT JOIN queryVersions as v on v.queryId = q.id GROUP BY q.id; CREATE VIEW queryCurrentConfigs as SELECT av.queryId, c.config FROM queryCurrentActiveVersions as av LEFT JOIN queryConfigs AS c ON av.queryId = c.queryId and isInVersion(av.activeVersion, c.addedVersion, c.removedVersion); CREATE VIEW queryCurrentRequiredIds as SELECT DISTINCT av.queryId, r.requiredQueryId FROM queryCurrentActiveVersions as av LEFT JOIN requiredQueries AS r ON av.queryId = r.queryId and isInVersion(av.activeVersion, r.addedVersion, r.removedVersion); CREATE VIEW queryCurrentRequiredIdsAGG as SELECT queryId, coalesce( ARRAY_AGG(DISTINCT requiredQueryId) FILTER (WHERE requiredQueryId != '00000000-0000-0000-0000-000000000000')::uuid[], array[]::uuid[] )::uuid[] as requiredIds FROM queryCurrentRequiredIds GROUP BY queryId; CREATE VIEW fullActiveQueries AS SELECT DISTINCT q.id, q.type, av.activeVersion, lv.latestVersion, c.config, r.requiredIds FROM queries AS q JOIN queryCurrentActiveVersions as av on q.id = av.queryId JOIN queryLatestVersions as lv on lv.queryId = q.id JOIN queryCurrentConfigs AS c ON q.id = c.queryId JOIN queryCurrentRequiredIdsAGG AS r ON q.id = r.queryId; CREATE VIEW queryActiveDependencies AS WITH RECURSIVE queryActiveDependencies(queryId, requiredQueryId, path, cycle) AS ( SELECT queryId, requiredQueryId, ARRAY[queryId, requiredQueryId]::uuid[] AS path, false AS cycle FROM queryCurrentRequiredIds UNION ALL SELECT q.queryId, qd.requiredQueryId, path || qd.requiredQueryId, qd.requiredQueryId = ANY(path) AS cycle FROM queryCurrentRequiredIds as q JOIN queryActiveDependencies as qd ON q.queryId = qd.requiredQueryId WHERE NOT qd.cycle -- Stop if we detect a cycle ) SELECT DISTINCT queryId as id, requiredQueryId FROM queryActiveDependencies WHERE NOT cycle;