如何编写使用UNION且可区分数据来源的SQL查询语句
合并查询后识别数据来源的实现方法
要在UNION合并结果中标记数据来源,核心是给两个查询分支新增一个相同类型的常量标识列,同时保证前后查询的列数、对应列的数据类型完全匹配,再给业务含义一致的字段统一别名,避免结果列名混乱。
修正后的SQL示例
SELECT customer, `calendar date` AS biz_date, -- 字段含空格需按数据库语法转义,MySQL用反引号,Oracle/PG用双引号 `sales amount` AS biz_amount, location AS biz_location, 'Sales' AS source_table -- 新增来源标识列 FROM Sales UNION ALL -- 无去重需求时优先用UNION ALL,性能远优于UNION SELECT customer, `cal date` AS biz_date, `sales price` AS biz_amount, `distribution location` AS biz_location, 'inventory' AS source_table -- 库存表对应的来源标识 FROM inventory
关键注意事项
- 列匹配规则:两个SELECT的列顺序、对应列的数据类型必须严格兼容,比如日期类字段、金额类字段要按业务含义一一对应,否则会触发类型转换报错。
- 语法选项选择:如果不需要对合并后的全量结果去重,务必用
UNION ALL替代UNION,UNION会对全量合并结果做排序去重,数据量大时会产生极高的性能开销,只有明确需要剔除完全重复的行时再使用UNION。 - 来源筛选逻辑:后续对合并结果做统计、过滤时,可以直接通过
source_table字段区分数据来源,比如筛选所有销售表数据可以加WHERE source_table = 'Sales'条件即可。
内容的提问来源于stack exchange,提问作者sandraknowles
相关产品推荐
相关产品推荐

