Impala SQL中列数不等的两表能否无需手动设NULL实现Union操作
多表Union自动补非公共列的最优方案
不同SQL引擎有不同的简化实现,不需要手动逐个声明NULL填充的非公共列:
- 支持
UNION BY NAME特性的引擎(Spark 3.1+、Snowflake、BigQuery、Databricks SQL)
直接使用UNION BY NAME/UNION ALL BY NAME语法即可,引擎会自动按列名匹配对齐,仅存在于大表的列会自动给小表的对应行填充NULL:-- UNION 带去重 SELECT * FROM Sample UNION BY NAME SELECT * FROM 小表名; -- UNION ALL 不带去重,性能更优 SELECT * FROM Sample UNION ALL BY NAME SELECT * FROM 小表名; - 不支持
UNION BY NAME的传统数据库(MySQL、PostgreSQL、Oracle等)
用动态SQL自动生成查询字段,避免手动拼写80个NULL列:
以PostgreSQL为例:
把生成的-- 执行该语句可以直接生成小表需要的SELECT字段串 SELECT string_agg( CASE WHEN col.column_name IN (SELECT column_name FROM information_schema.columns WHERE table_name = '你的小表名') THEN col.column_name ELSE 'NULL AS ' || quote_ident(col.column_name) END, ', ' ORDER BY col.ordinal_position ) AS select_clause FROM information_schema.columns col WHERE col.table_name = 'Sample';select_clause结果替换到小表的SELECT部分,再执行UNION即可,全程不需要手动枚举非公共列。
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

