Hive SQL如何选取两表共有列做union all且无需重复编写列名
SQL 两表公共列合并简化方案
下面是不同场景下的可落地实现方案:
方案1:查询元数据表批量获取公共列(通用所有关系型数据库)
所有主流关系型数据库都支持查询系统元数据表获取两表的公共列,直接生成列列表,不用手动挨个核对填写。
以MySQL为例,执行以下查询即可得到逗号分隔的公共列列表:
SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ', ') AS common_columns FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME IN ('A', 'B') GROUP BY COLUMN_NAME HAVING COUNT(*) = 2;
把查询得到的common_columns结果直接复制到你的UNION ALL语句中即可,后续调整列时重新执行一次该查询就能拿到最新的列列表,修改成本极低。
其他数据库只需要调整元数据表的语法即可:
- PostgreSQL 把
GROUP_CONCAT换成string_agg,元表过滤条件调整为table_schema = 'public' - SQL Server 把
GROUP_CONCAT换成STRING_AGG
方案2:动态SQL自动执行(适合批量/定时执行场景)
如果不想手动复制列,可以用动态SQL直接拼接并执行查询,以PostgreSQL函数为例:
CREATE OR REPLACE FUNCTION get_ab_union() RETURNS SETOF RECORD AS $$ DECLARE common_cols text; query text; BEGIN -- 获取公共列列表 SELECT string_agg(column_name, ', ') INTO common_cols FROM information_schema.columns WHERE table_name IN ('A', 'B') AND table_schema = 'public' GROUP BY column_name HAVING COUNT(*) = 2; -- 拼接查询语句并执行 query := format('SELECT %s FROM A UNION ALL SELECT %s FROM B', common_cols, common_cols); RETURN QUERY EXECUTE query; END $$ LANGUAGE plpgsql;
后续调用直接执行SELECT * FROM get_ab_union()即可,表公共列有变动时自动适配,不需要修改代码。
方案3:视图封装(适合频繁查询的场景)
如果这个合并逻辑经常被用到,可以提前封装为视图,后续调整列只需要修改一次视图定义即可,所有调用视图的地方不需要改动:
-- 首次创建视图 CREATE VIEW v_ab_union AS SELECT col1, col2, col3 FROM A UNION ALL SELECT col1, col2, col3 FROM B; -- 后续查询直接调用 SELECT * FROM v_ab_union;
注意事项
- 所有方案都需要提前确认两表同名列的数据类型兼容,否则UNION时会触发类型转换报错。
- 禁止直接使用
SELECT * FROM A UNION ALL SELECT * FROM B的写法,一旦两表的列顺序、非公共列数量发生变动,会出现隐性数据错位问题,排查成本极高。
内容的提问来源于stack exchange,提问作者luowu
相关产品推荐
相关产品推荐

