Подзапрос SQLAlchemy в предложении from без соединения
Мне нужна небольшая помощь. У меня есть следующий запрос, и мне интересно, как его представить с точки зрения sqlalchemy.ОЗР. В настоящее время я выполняю его по сеансу.выполнять. Это не критично для меня, но мне просто любопытно. То, что я на самом деле не знаю, - это как поместить подзапрос в предложение 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 начинает анализировать все данные и не только после этого. Но мой стол огромен, и я не могу себе этого позволить.
если что-то не очень понятно, пожалуйста, спрашивайте, я постараюсь)
1 ответов
Я предполагаю, что это 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)
однако вы можете избежать одного подзапроса, используя