需要帮助了解全外连接

时间:2013-09-30 20:36:04

标签: sql db2

我想使用完全外连接来连接两个带有记录(id,value)的表。这两个表在id字段上没有交集,但我想通过id字段加入它们。我正在尝试使用完全外连接来完成此连接,但我不明白如何。

我正在使用DB2。

到目前为止,我已经(每个语句单独手动执行):

create table S1 (
    id integer primary key not null,
    value integer not null)

create table S2 (
    id integer primary key not null,
    value integer not null)

insert into S1 values (0, 50)
insert into S1 values (1, 20)

insert into S2 values (2, 40)
insert into S2 values (3, 90)

select * from S1 full outer join S2

我在完全外连接尝试时遇到错误:

SQL0104N  An unexpected token "join S2" was found following "* from S1 full
outer".  Expected tokens may include:  "<space>".  SQLSTATE=42601
编辑:谢谢!我得到了它的工作,但这不是我的预期。

select * from S1 full outer join S2 on S1.id = S2.id
问题是现在它显示(:表示空格)

+--+-----+--+-----+
|ID|VALUE|ID|VALUE|
+--+-----+--+-----+
|-:|-::::|3:|90:::|
+--+-----+--+-----+
|-:|-::::|2:|40:::|
+--+-----+--+-----+
|1:|20:::|-:|-::::|
+--+-----+--+-----+
|0:|50:::|-:|-::::|
+--+-----+--+-----+

我不想要重复的字段。有没有办法让表连接成:

+--+-----+
|ID|VALUE|
+--+-----+

表?

我尝试使用

select id from s1
full outer join s2 on s1.id = s2.id

并且不用说,我得到

SQL0203N  A reference to column "ID" is ambiguous.  SQLSTATE=42702

解决!

select coalesce(s1.id, s2.id) as id, \
       coalesce (s1.value, s2.value) as value \
from s1 full outer join s2 on s1.id = s2.id and s1.value = s2.value  
group by id asc  

和D Stanley的另一个解决方案(mofidied)

SELECT Id, Value \
FROM S1 \
UNION ALL \
SELECT Id, Value \ 
FROM S2 \
ORDER BY ID ASC

谢谢!

2 个答案:

答案 0 :(得分:3)

新答案

根据您更新的问题,您需要UNION,而不是JOIN

SELECT Id, Value
FROM S1
UNION ALL
SELECT Id, Value 
FROM S2

原始回答

您仍需要某些条件才能加入表格。如果ID 从不相交,您可以使用

SELECT * 
FROM S1 
FULL OUTER JOIN S2 ON S1.id = S2.id

答案 1 :(得分:0)

FULL OUTER JOIN,因为其他OUTER和INNER JOIN在声明表之后想要一个ON子句。

这样:

SELECT *
FROM S1
FULL OUTER JOIN S2
ON S1.field = S2.field

只有没有ON子句的JOIN才是CROSS JOIN(因为实现笛卡尔积)