如何在SELECT语句中使用UNION?

4

我是一名能翻译文字的助手。

以下是需要翻译的内容:

我有两个表(这里是示例):

X1   Y1
a   1
b   2
c   3
d   4 

并且

X2   Y2
a    5
m    6
n    7
b    4

我希望输出列:

X    Y1   y2
a    1    5
b    2    4
c    3    0
d    4    0
m    0    6
n    0    7

我尝试的方法是:
SELECT (A.X1 UNION B.X1) AS X, A.Y1,B.Y2
FROM A FULL OUTER JOIN B
ON A.X1 = B.X2

(上述查询仅为示例。)执行此查询后,我收到以下错误消息:
语法错误:在选择子句中靠近UNION
有人能告诉我这里出了什么问题吗?是否有其他选项可以以所述格式获取输出表格?

这个问题最好使用连接(join)而不是联合(union)来解决,因为你的表定义中有一个共同的列。此外,在这里你不需要使用联合,你可以只选择其中一个,否则你会得到一个类似于"aa 1 5"的结果,尽管这并不符合你的实际需求。 - Jeremy C.
4个回答

9

union用于将结果一个接一个地连接起来。您正在尝试将结果并排连接(您已经做到了!)。您唯一缺少的是使用coalesce处理缺失值:

SELECT COALESCE(a.x1, b.x2) AS x, 
       COALESCE(a.y1, 0) AS y1, 
       COALESCE(b.y2, 0) AS y2
FROM   a 
FULL OUTER JOIN b on a.x1 = b.x2

总是忘记使用coalesce :p - Jeremy C.
给结果列命名,以免它们最终成为“coalesce”:http://sqlfiddle.com/#!15/e8b77/7 - Guffa
1
@Guffa 很不错的改进,谢谢!我编辑了我的答案以包括列别名。 - Mureinik
@Mureinik 感谢您的解决方案 :) - Madhusudan

4
你可以尝试使用 COALESCE 函数。

COALESCE 函数返回其参数中第一个非空值。只有当所有参数都为空时,才返回 null。

SELECT COALESCE(A.X1,B.X2) AS X, COALESCE(A.Y1, 0) AS Y1, COALESCE(B.Y2, 0) AS Y2
FROM A FULL OUTER JOIN B
ON A.X1 = B.X2

谢谢 :) 我不知道 COALESCE 函数。再次感谢 :) - Madhusudan

3
SELECT Coalesce(a.x1,b.x1) AS X, coalesce(a.y1,0) as Y1 coalesce(b.y2,0) as Y2
FROM a
FULL OUTER JOIN
b ON a.x1 = b.x2

您在这里不需要UNION语句,UNION语句用于将一个SELECT的结果集添加到来自不同SELECT的结果集中。
您只需要使用正确的ON语句进行连接(您已经做对了),并从其中一张表格中获取x1或x2,因为在同一行中x1等于x2。
编辑:在我的查询中添加了COALESCE语句,如果a.x1不存在但b.x2存在,则返回x的值,如果y1或y2的字段不存在则添加0。

1
错误是因为UNION不是可以用在列列表中的命令,它是在集合级别上使用的,你可以像这样联合两个选择:
SELECT * FROM table1
UNION
SELECT * FROM table2

他们只需要具有相同的列


2
这并不能给他所需的结果,这只会显示两个表格中的结果,例如:
X Y a 1 a 5
- Jeremy C.
这就是我说的,对吧?只是我的值没有被正确格式化,因为我仍然不知道如何在注释框中格式化内容。 - Jeremy C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接