SQLAlchemy Nested CTE Query - PullRequest
       1

SQLAlchemy Nested CTE Query

2 голосов
/ 23 октября 2019

Похоже, что построитель базовых запросов 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, был бы идеальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...