SQL Server SELECT UNION语句如何添加表来源标识列
直接新增来源列后UNION失效,是因为UNION会对查询返回的所有列做整体去重,你给A表行加'A'、B表行加'B'后,原本完全相同的业务行会因为来源列值不同,被判定为不同行,自然无法合并。以下是两种可行实现方案:
方案1:FULL OUTER JOIN 实现(支持全外连接的数据库通用,如MySQL 8.0+、PostgreSQL、Oracle等)
SELECT COALESCE(a.Col1, b.Col1) AS Col1, COALESCE(a.Col2, b.Col2) AS Col2, COALESCE(a.Col3, b.Col3) AS Col3, CASE WHEN a.Col1 IS NOT NULL AND b.Col1 IS NOT NULL THEN 'AB' WHEN a.Col1 IS NOT NULL THEN 'A' ELSE 'B' END AS Col4 FROM A FULL OUTER JOIN B ON A.Col1 = B.Col1 AND A.Col2 = B.Col2 AND A.Col3 = B.Col3;
逻辑:将两张表按所有业务列等值关联,全外连接会保留两张表的所有行,匹配成功的就是两表共有的行,仅单侧有值的就是单表独有行,通过CASE判断输出对应来源标识即可。
方案2:UNION ALL + 分组聚合(兼容性更强,无全外连接的数据库也可使用)
SELECT Col1, Col2, Col3, CASE WHEN COUNT(DISTINCT source) = 2 THEN 'AB' ELSE MAX(source) END AS Col4 FROM ( SELECT 'A' AS source, Col1, Col2, Col3 FROM A UNION ALL SELECT 'B' AS source, Col1, Col2, Col3 FROM B ) AS combined_data GROUP BY Col1, Col2, Col3;
逻辑:先用UNION ALL保留两张表的所有行和对应来源标识,再按三个业务列分组,统计每个分组的来源数量:有两个不同来源的就是两表共有,标记为AB,剩下的只有一个来源,直接取对应来源值即可。
内容的提问来源于stack exchange,提问作者Conner
相关产品推荐
相关产品推荐

