Похоже, что построитель базовых запросов sqlalchemy разворачивает и перемещает запросы CTE в «верх» скомпилированного sql.
Я преобразую существующий запрос postgres, который выбирает глубоко соединенные данные, как один объект json. Синтаксис довольно надуманный, но он значительно снижает нагрузку на сеть для больших запросов. Цель состоит в том, чтобы построить запрос динамически, используя основной построитель запросов sqlalchemy.
Вот минимальный рабочий пример вложенного CTE
with res_cte as (
select
account_0.name acct_name,
(
with offer_cte as (
select
offer_0.id
from
offer offer_0
where
offer_0.account_id = account_0.id
)
select
array_agg(offer_cte.id)
from
offer_cte
) as offer_arr
from
account account_0
)
select
acct_name::text, offer_arr::text
from res_cte
Result
acct_name, offer_arr
---------------------
oliver, null
rachel, {3}
buddy, {4,5}
(из-за неправильного использования) основной построитель запросов пытается удалить offer_cte
, и в результате каждый offer.id
ассоциируется с каждым account_name
в результате.
Нет необходимости повторно реализовывать этот точный запрос вответ, любой пример, который приводит к тому же вложенному cte, был бы идеальным.