如何用SQL查询数据库中行数大于0的非空表?
解决方法:按数据库类型选择对应查询语句
不同数据库的系统元数据表结构存在差异,table_rows是MySQL专属的列,其他数据库并不支持,所以会报无效列错误。以下是各主流数据库的可行查询方案:
1. MySQL/MariaDB
原语句本身适配这类数据库,只需替换正确的数据库名即可。注意table_rows是估算值,若需要精确结果可使用动态SQL:
估算查询
SELECT table_name FROM information_schema.tables WHERE table_schema = '你的数据库名' AND table_rows > 0;
精确查询(生成执行语句)
SELECT CONCAT('SELECT ''', table_name, ''' AS table_name, COUNT(*) AS row_count FROM ', table_name, ' HAVING row_count > 0;') FROM information_schema.tables WHERE table_schema = '你的数据库名';
执行生成的所有语句,筛选出行数大于0的表即可。
2. SQL Server
使用sys.dm_db_partition_stats统计行数,或生成动态查询验证:
快速统计
SELECT t.name AS table_name FROM sys.tables t JOIN sys.dm_db_partition_stats ps ON t.object_id = ps.object_id WHERE ps.index_id IN (0, 1) -- 匹配堆表或聚集索引 AND ps.row_count > 0 AND SCHEMA_NAME(t.schema_id) = '你的架构名'; -- 例如dbo
存在性验证(生成执行语句)
SELECT 'SELECT ''' + name + ''' AS table_name WHERE EXISTS(SELECT 1 FROM ' + QUOTENAME(name) + ');' FROM sys.tables WHERE SCHEMA_NAME(schema_id) = '你的架构名';
执行生成的语句,有返回结果的即为存在数据的表。
3. PostgreSQL
通过pg_stat_user_tables获取估算行数,或生成动态查询精确验证:
估算查询
SELECT relname AS table_name FROM pg_stat_user_tables WHERE schemaname = '你的架构名' -- 例如public AND n_live_tup > 0;
精确验证(生成执行语句)
SELECT 'SELECT ''' || relname || ''' AS table_name WHERE EXISTS(SELECT 1 FROM ' || quote_ident(relname) || ');' FROM pg_stat_user_tables WHERE schemaname = '你的架构名';
执行生成的语句,筛选有结果的表。
4. SQLite
SQLite无系统表存储行数,需逐个表验证是否存在数据:
SELECT name AS table_name FROM sqlite_master WHERE type = 'table' AND EXISTS(SELECT 1 FROM ' || name || ');
若表名含特殊字符,需手动添加引号包裹,或用脚本遍历执行SELECT 1 FROM 表名 LIMIT 1,有结果则表存在数据。
内容的提问来源于stack exchange,提问作者Natalie
相关产品推荐
相关产品推荐

