【发布时间】:2020-02-19 03:20:27
【问题描述】:
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
结果
acct_name, offer_arr
---------------------
oliver, null
rachel, {3}
buddy, {4,5}
(我的错误使用)核心查询构建器尝试取消嵌套 offer_cte 并导致每个 offer.id 与结果中的每个 account_name 相关联。
没有必要在答案中重新实现这个确切的查询,任何导致类似嵌套 CTE 的示例都是完美的。
【问题讨论】:
-
你用的是什么版本的 postgresql?
-
不是您要的,而是用子查询替换无偿的 CTE 以避免该问题。也更快。
标签: python sql postgresql sqlalchemy