UNION忽略列名?

时间:2013-06-05 17:29:08

标签: mysql sql union

为什么

select 1 as a, 2 as b
union all
select 20 as b, 10 as a

返回

a   b
1   2
20  10

而不是

a   b
1   2
10  20

有没有办法让union匹配列名?

4 个答案:

答案 0 :(得分:3)

NION,UNION需要按顺序选择它们。

答案 1 :(得分:2)

列名仅与联合的第一部分相关,以便对联合列进行定义。其他联合将以相同的顺序加入第一个选择的列,并且通常具有不同的名称。如果您想要将第一列与第二列相关联,则不能。但是,您可以调整第二个选择参数以使列按正确顺序排列。

答案 2 :(得分:2)

Union仅查看列数及其在查询字符串中的相对位置。它不会基于别名或源列名混合匹配。例如你可以有两个完全不同的表:

SELECT x,y FROM foo
UNION
SELECT p,q FROM bar

在这种情况下,MySQL应该做什么?返回一行

x,y,p,q

因为没有列名匹配?不。那是不对的。

答案 3 :(得分:1)

我不确定这是否能解决您的问题,但您可以使用union中的子查询将列按“正确”顺序排列:

(select a, b from (select 1 as a, 2 as b) t)
union all
(select a, b from (select 20 as b, 10 as a) t)

我意识到问题是标记MySQL,它不支持full outer join。如果是这样,您可以执行union all as:

select coalesce(t1.a, t2.a) as a, coalesce(t1.b, t2.b) as b
from (select 1 as a, 2 as b) t1 full outer join
     (select 20 as b, 10 as a) t2
     on 0 = 1;

可以在MySQL中执行此操作。这假设您的值都不是NULL:

select coalesce(t1.a, t2.a) as a, coalesce(t1.b, t2.b) as b
from (select 1 as a, 2 as b union all select NULL, NULL) t1 join
     (select 20 as b, 10 as a union all select NULL, NULL) t2
     on (t1.a is null or t2.a is null) and coalesce(t1.a, t2.a) is not null