请帮助以下查询: sqlite查询以获取其中包含记录数的所有表名列表:
我想获取Sqlite3数据库中每个表中的行数。我想避免写出冗长的查询。我可以获得这样的表列表:
从sqlite_master中选择名称,其中type ='table' 并且我想在这样的子查询中使用它:
从(SELECT name from sqlite_master WHERE type ='table')中选择计数(*); 但只会返回子查询中的总行,这不是我想要的。
答案 0 :(得分:0)
也许您使用ANALYZE
的结果来创建解决方法。它创建内部模式对象sqlite_stat1
2.6.3。 sqlite_stat1表
sqlite_stat1是由ANALYZE命令创建的内部表 并用于保存有关表和索引的补充信息 查询计划程序可以用来帮助它找到更好的方法 执行查询。应用程序可以更新,删除或插入 或删除sqlite_stat1表,但不能创建或更改 sqlite_stat1表。 sqlite_stat1表的架构为 如下:
CREATE TABLE sqlite_stat1(tbl,idx,stat);
通常每个索引有一行,其中的索引由 sqlite_stat1.idx列中的名称。 sqlite_stat1.tbl列是 索引所属的表的名称。在每一行中 sqlite_stat.stat列将是一个字符串,其中包含 整数,后跟零个或多个参数。这个的第一个整数 list是索引中的大约行数。 (的数量 索引中的行数与表中的行数相同, 除了部分索引。).....
如果没有部分索引,则SELECT tbl,cast(stat as INT)
将返回每个表中的行数,除非该表有0行。
此sql在小型(25MB,34个表,26个索引,33K +行)生产数据库上给出了预期的结果。您的里程可能(会吗?)会有所不同。
ANALYZE;
select DISTINCT tbl_name, CASE WHEN stat is null then 0 else cast(stat as INT) END numrows
from sqlite_master m
LEFT JOIN sqlite_stat1 stat on m.tbl_name = stat.tbl
where m.type='table'
and m.tbl_name not like 'sqlite_%'
order by 1;
--drop table sqlite_stat1;