Подзапрос 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)

однако вы можете избежать одного подзапроса, используя