12

我需要一点帮助。我有以下查询,我很好奇如何用 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中没有限制开始解析所有数据并且仅在此之后才限制。但是我的桌子很大,我买不起。

如果有什么不是很清楚,请询问,我会尽力而为)

4

1 回答 1

16

我认为这是 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)
于 2013-08-15T21:28:27.400 回答