首页 > 解决方案 > UNION 仅基于一列

问题描述

我想基于单个列合并两个表。

假设,我有一个名为 t1 的表:

Id |  Name  
------------
1  |    A   
2  |    B  
3  |    C   

还有一个名为 t2 的表:

Id |  Name  
------------
1  |    B   
3  |    B  
5  |    B

我想像这样联合它们:

SELECT * FROM T1
UNION
SELECT * FROM T2
BASED ON ID 

我期待这样的结果:

Id |  Name  
------------
1  |    A   
2  |    B  
3  |    C 
5  |    B

如果 ID 相等,则从第一个表中选择行:

实际上,我正在使用具有 20 多列的表。这些表格用于演示。

标签: mysqlsqlpivotsubqueryunion

解决方案


一种选择使用not exists

select id, name
from t1
union all
select id, name
from t2
where not exists (select 1 from t1 where t1.id = t2.id)

你也可以使用条件聚合——虽然这更麻烦,而且效率可能有点低:

select
    id,
    coalesce(
        max(case when which = 1 then name end),
        max(case when which = 2 then name end)
    ) name
from (
    select id, name, 1 which from t1
    union all
    select id, name, 2 from t2
) t
group by id

推荐阅读