不支持UNION/UNION ALL时,SQL实现多表名与行数同列输出方法
解决方法
由于环境不支持UNION/UNION ALL,可以通过以下几种方式实现单列表结构的统计结果:
方法1:利用DUAL表构造多行结果(适用于Oracle、MySQL等支持DUAL的数据库)
每个表的统计作为一个独立的SELECT语句,通过逗号分隔生成多行:
SELECT 'tbl_1' AS table_name, (SELECT COUNT(*) FROM sql_table WHERE ...) AS table_count FROM DUAL , (SELECT 'tbl_2' AS table_name, (SELECT COUNT(*) FROM sql_table_2 WHERE ...) AS table_count FROM DUAL) , (SELECT 'tbl_3' AS table_name, (SELECT COUNT(*) FROM sql_table_3 WHERE ...) AS table_count FROM DUAL)
方法2:使用VALUES子句结合子查询(适用于PostgreSQL、SQL Server等支持VALUES的数据库)
通过VALUES构造行数据,每行嵌套子查询获取对应表的行数:
SELECT * FROM ( VALUES ('tbl_1', (SELECT COUNT(*) FROM sql_table WHERE ...)), ('tbl_2', (SELECT COUNT(*) FROM sql_table_2 WHERE ...)), ('tbl_3', (SELECT COUNT(*) FROM sql_table_3 WHERE ...)) ) AS result(table_name, table_count)
方法3:通过交叉连接常量生成多行(通用兼容方案)
如果数据库不支持DUAL或VALUES,可以用常量表交叉连接生成行数,再配合CASE匹配每个表的统计:
SELECT CASE rownum WHEN 1 THEN 'tbl_1' WHEN 2 THEN 'tbl_2' WHEN 3 THEN 'tbl_3' END AS table_name, CASE rownum WHEN 1 THEN (SELECT COUNT(*) FROM sql_table WHERE ...) WHEN 2 THEN (SELECT COUNT(*) FROM sql_table_2 WHERE ...) WHEN 3 THEN (SELECT COUNT(*) FROM sql_table_3 WHERE ...) END AS table_count FROM (SELECT 1 AS rownum UNION SELECT 2 UNION SELECT 3) -- 若环境连UNION都不支持,可替换为(SELECT 1 FROM some_small_table WHERE rownum <=3) AS num_table
注意事项
- 上述所有方法中,子查询里的
WHERE条件保留你原有的过滤逻辑即可。 - 如果环境限制极严,甚至不能用子查询,可以分多次查询每个表的行数,再手动整理成目标格式。
内容的提问来源于stack exchange,提问作者Sam Sandy
相关产品推荐
相关产品推荐

