如何在select子句中使用union?

时间:2015-05-08 06:31:04

标签: sql postgresql select union

我有两个表(例如在这里创建),如:

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

(上面提到的查询只是样本)。 执行此查询后,我收到错误消息:

  

语法错误:在select子句中的UNION附近

有人可以告诉我这里有什么问题。是否有其他选项以上述格式获取输出表?

4 个答案:

答案 0 :(得分:8)

union用于一个接一个地加入结果。您并排尝试join结果(您已经做过了!)。您唯一缺少的是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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:1)

错误是因为UNION不是可以在列列表中使用的命令,它在设置级别,你可以选择UNION两个:

SELECT * FROM table1
UNION
SELECT * FROM table2

他们只需要有相同的列