[英]SQLAlchemy subquery in from clause without join
我需要一些帮助。 我有以下查询,我很好奇如何用sqlalchemy.orm来表示它。 目前我正在通过session.execute执行它。 它对我来说并不重要,但我只是好奇。 我实际上不知道的是如何在不执行任何连接的情况下将子查询放在FROM子句(嵌套视图)中。
select g_o.group_ from (
select distinct regexp_split_to_table(g.group_name, E',') group_
from (
select array_to_string(groups, ',') group_name
from company
where status='active'
and array_to_string(groups, ',') like :term
limit :limit
) g
) g_o
where g_o.group_ like :term
order by 1
limit :limit
由于速度问题,我需要这个子查询的东西 - 在大多数内部查询函数中没有限制, regexp_split_to_table开始解析所有数据并且仅在此之后进行限制。 但我的桌子很大,我付不起钱。
如果事情不是很清楚,请问,我会尽我所能)
我认为这是PostgreSQL。
要创建子查询,请使用subquery()
方法。 生成的对象可以像使用Table
对象一样使用。 以下是SQLAlchemy中查询的外观:
subq1 = session.query(
func.array_to_string(Company.groups, ',').label('group_name')
).filter(
(Company.status == 'active') &
(func.array_to_string(Company.groups, ',').like(term))
).limit(limit).subquery()
subq2 = session.query(
func.regexp_split_to_table(subq1.c.group_name, ',')
.distinct()
.label('group')
).subquery()
q = session.query(subq2.c.group).\
filter(subq2.c.group.like(term)).\
order_by(subq2.c.group).\
limit(limit)
然而,你可避免一个子查询使用unnest
函数,而不是转换数组字符串arrayt_to_string
,然后用它分裂regexp_split_to_table
:
subq = session.query(
func.unnest(Company.groups).label('group')
).filter(
(Company.status == 'active') &
(func.array_to_string(Company.groups, ',').like(term))
).limit(limit).subquery()
q = session.query(subq.c.group.distinct()).\
filter(subq.c.group.like(term)).\
order_by(subq.c.group).\
limit(limit)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.