为什么
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
匹配列名?
答案 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