SQLAlchemy的子查询subquery()
subquery() 是 SQLAlchemy 提供的一种查询方式,允许你在主查询中嵌入子查询。它允许我们执行更复杂的查询,例如在主查询中使用嵌套的查询结果,进行多层次的筛选、聚合或者关联操作。
1. 子查询(Subquery)概述
子查询是一个嵌套的查询,它作为一个临时的结果集参与到主查询中。
子查询常用于:
- 在主查询中使用复杂的筛选条件
- 执行聚合操作,并在主查询中引用
- 提高查询性能(尤其在需要多次查询同一个数据时)
2. 基本语法和使用
子查询的基本语法是通过构建一个子查询对象,并将其作为主查询的一部分来使用
- 子查询返回的列可以使用 .c 来访问,就像普通的 SQLAlchemy 查询对象一样
- 可以为子查询中的列指定别名,以便在主查询中清晰地引用
demo.py
SELECT
admin_report.admin_report_uuid,
admin_report.admin_report_title,
admin_report.admin_report_theme_id,
admin_report.admin_report_link,
admin_report.create_time,
admin_report.update_time,
admin_report.admin_report_type_id,
admin_report.admin_report_id,
admin_report.is_download,
anon_1.department_list
FROM admin_report
JOIN admin_theme ON admin_theme.admin_theme_id = admin_report.admin_report_theme_id
JOIN (SELECT admin_report_department_r.admin_report_id AS admin_report_id, string_agg(CAST(admin_report_department_r.department_id AS VARCHAR), ',') AS department_list
FROM admin_report_department_r
WHERE admin_report_department_r.del_flag = 0 GROUP BY admin_report_department_r.admin_report_id) AS anon_1 ON anon_1.admin_report_id = admin_report.admin_report_id
WHERE admin_report.create_time >= '2024-06-08T16:00:00.000Z' AND admin_report.create_time <= '2025-06-09T15:59:59.999Z' ORDER BY admin_report.create_time DESC