记录数据库的union的坑

61 阅读1分钟

抛出问题: 两个表union,他们的列名不一样会影响结果吗?

blog.csdn.net/iilegend/ar…

简单描述下需求

create table t(upper varchar(20), lower varchar(20));
insert into t values ('port1', 'port2'),  ('port3', 'port4'),  ('port5', 'port6');

现在想获取<upper, lower> 和 <lower, upper>, 查询语句如下


select * from
(select upper AS a, lower as z from t
union 
select upper AS z, lower as a from t
) tmp;

一眼看上去好像没啥问题,但实际上输出的结果仍然是


-- upper | lower
-- ------+------
-- port1 | port2
-- port3 | port4
-- port5 | port6

而不是预期的

-- upper | lower
-- ------+------
-- port1 | port2
-- port3 | port4
-- port5 | port6
-- port2 | port1
-- port4 | port3
-- port6 | port5

原因: mysql的union规则是

  1. 最终结果的列名为 首个select的列名
  2. union的是 第几列,和别名无关。

所以,为了达成效果,需要修改查询为

select * from
(select upper AS a, lower as z from t
union 
select lower AS a, upeer as z from t
) tmp;