SQLite3如何合并多查询批量获取各表有效数据的首尾时间
实现方案
SQLite不支持直接在查询中动态使用表名,你可以通过先生成联合查询语句再执行的方式实现需求,全程只需两次SQL执行,150张表的场景下性能优异:
步骤1:生成最终查询语句
运行以下SQL,会自动拼接所有业务表的查询逻辑:
SELECT GROUP_CONCAT( 'SELECT ''' || name || ''' AS "Table", MIN(Date) AS "First", MAX(Date) AS "Last" FROM "' || name || '" WHERE Value IS NOT NULL', ' UNION ALL ' ) AS final_query FROM sqlite_schema WHERE type = 'table' AND name NOT LIKE 'sqlite_%';
步骤2:执行生成的查询语句
把步骤1返回的final_query结果复制出来直接运行,就能得到你要的包含Table/First/Last三列的结果表。
方案说明
- 这里直接用
MIN(Date)/MAX(Date)聚合函数替代你原有的ORDER BY + LIMIT写法,配合你已经创建的Date字段索引,查询效率更高,无需全表排序就能直接拿到极值。 - 生成的查询逻辑会自动为每个表单独统计有效数据的日期范围,通过
UNION ALL把所有表的结果汇总到一起。 - SQLite默认
GROUP_CONCAT最大长度为1000000,150张表的拼接完全不会触发长度限制,无需额外调整参数。
生成的查询示例
你最终执行的SQL大概结构如下:
SELECT 'MY_FIRST_TABLE' AS "Table", MIN(Date) AS "First", MAX(Date) AS "Last" FROM "MY_FIRST_TABLE" WHERE Value IS NOT NULL UNION ALL SELECT 'SECOND_TABLE_NAME' AS "Table", MIN(Date) AS "First", MAX(Date) AS "Last" FROM "SECOND_TABLE_NAME" WHERE Value IS NOT NULL UNION ALL -- 其余表的查询逻辑自动拼接在此处
内容的提问来源于stack exchange,提问作者JohnDizzle
相关产品推荐
相关产品推荐

