异构列数表自动补Null Union及多季度表批量合并咨询
问题2:批量处理22+主表的季度表Union
你的场景里手动用Excel找列交集效率太低,最适合的方案是批量动态SQL脚本,自动识别每个主表的所有季度表,生成合并语句,完全自动化处理。
核心思路
- 从表名中识别所有主表前缀(比如从
TableA_Q1提取TableA)。 - 对每个主表,获取其所有季度表的列全集。
- 为每个季度表生成补全Null的
SELECT语句,拼接成UNION ALL,最终生成一个汇总表(或视图)。
实操示例(MySQL存储过程,批量处理所有主表)
这个存储过程会自动遍历所有符合命名规则的季度表,为每个主表生成汇总表(比如TableA_All):
DELIMITER // CREATE PROCEDURE BatchUnionQuarterlyTables() BEGIN DECLARE done INT DEFAULT 0; DECLARE main_table_name VARCHAR(100); -- 游标获取所有主表前缀 DECLARE main_tables CURSOR FOR SELECT DISTINCT SUBSTRING_INDEX(table_name, '_Q', 1) FROM information_schema.columns WHERE table_name LIKE '%_Q[1-4]' -- 匹配季度表,可根据你的命名规则调整 GROUP BY SUBSTRING_INDEX(table_name, '_Q', 1); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN main_tables; read_loop: LOOP FETCH main_tables INTO main_table_name; IF done THEN LEAVE read_loop; END IF; -- 获取当前主表所有季度表的列全集 DECLARE all_cols TEXT DEFAULT ''; SELECT GROUP_CONCAT(DISTINCT column_name SEPARATOR ', ') INTO all_cols FROM information_schema.columns WHERE table_name LIKE CONCAT(main_table_name, '_Q%'); -- 生成所有季度表的SELECT语句并拼接成Union DECLARE union_sql TEXT DEFAULT ''; SELECT GROUP_CONCAT( CONCAT('SELECT ', (SELECT GROUP_CONCAT(CASE WHEN EXISTS(SELECT 1 FROM information_schema.columns WHERE table_name = q.table_name AND column_name = c.column_name) THEN c.column_name ELSE CONCAT('NULL AS ', c.column_name) END SEPARATOR ', ') FROM (SELECT column_name FROM information_schema.columns WHERE table_name LIKE CONCAT(main_table_name, '_Q%') GROUP BY column_name) c), ' FROM ', q.table_name) SEPARATOR ' UNION ALL ') INTO union_sql FROM (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_name LIKE CONCAT(main_table_name, '_Q%')) q; -- 创建汇总表(如果需要视图,改成CREATE VIEW即可) SET @final_sql = CONCAT('CREATE TABLE IF NOT EXISTS ', main_table_name, '_All AS ', union_sql); PREPARE stmt FROM @final_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE main_tables; END // DELIMITER ;
调用方式:CALL BatchUnionQuarterlyTables();,执行后每个主表都会生成对应的汇总表,包含所有季度的数据,缺失列自动补Null。
注意事项
- 不同数据库的系统信息表略有差异:比如SQL Server用
sys.columns和sys.tables,PostgreSQL用information_schema.columns和pg_tables,需要根据你的数据库调整脚本中的表名和字段。 - 如果不需要物理表,可把
CREATE TABLE改成CREATE VIEW,生成视图更节省存储空间。
内容的提问来源于stack exchange,提问作者Amit Singh Parihar
相关产品推荐
相关产品推荐

