我有三张桌子A B和C(最后一张是我想要的结果)
A.id B.age C.id C.age result id age
1 5 1 5 1 5
2 6 2 0 null null
3 7 0 7 null null
4 8 4 8 4 8
5 9 5 9 5 9
我想从A和B到C进行外连接,这样我最终会得到上面的结果。 如果C中缺少任一列,则它应该为null。 如果我进行内部联接:
select a.id, b.age where a.id = c.id and b.age = c.age
我会回来3排。 我还想要5行。我正在使用IBM db2 v9。 我试图找出使用较新的左外连接语法如何使它去,但我没有看到它。 我可以看到我在旧的sybase * =外连接语法中如何做到这一点,但我看不出如何以新风格的方式做到这一点。 这甚至可能吗?
有人建议加入一半的结果。工会只是搞得一团糟,在我看来,我应该可以从两个表中做一个左外连接。
帮助? 感谢。
答案 0 :(得分:1)
你是说这个吗?
SELECT a.id, b.age
FROM a
CROSS JOIN b
LEFT OUTER JOIN c on a.id = c.id AND b.age = c.age
您的问题不清楚您是否交叉加入A和B,或者B是否也被加入:
SELECT a.id, b.age
FROM a
LEFT OUTER JOIN c on a.id = c.id
LEFT OUTER JOIN b on b.age = c.age
还有更多可能的组合...
答案 1 :(得分:0)
-- A Dummy table
with A as (
select
2 as id
from
sysibm.sysdummy1)
-- B Dummy table
, B as (
select
6 as age
from
sysibm.sysdummy1)
-- C Dummy table
, C as (
select
2 as id,
0 as age
from
sysibm.sysdummy1)
-- Actual result query
select
A.id as "A.id",
B.age as "B.age",
C.id as "C.id",
C.age as "C.age",
case
when A.id = C.id and B.age = C.age then
C.id
else
null
end as "result id",
case
when A.id = C.id and B.age = C.age then
C.age
else
null
end as "result age"
from
sysibm.sysdummy1 as Dummy
left outer join A as A on 1=1
left outer join B as B on 1=1
left outer join C as C on 1=1
这是我的解决方案,它将产生与原始帖子匹配的结果。只需使用提供的示例替换A,B和C虚拟表中的值。
修改强> 不使用case语句的相同结果:
select
A.id as "A.id",
B.age as "B.age",
C.id as "C.id",
C.age as "C.age",
R.id as "result id",
R.age as "result age"
from
sysibm.sysdummy1 as Dummy
left outer join A as A on 1=1
left outer join B as B on 1=1
left outer join C as C on 1=1
left outer join C as R
on A.id = R.id
and B.age = R.age
答案 2 :(得分:0)
这是对这个问题的迟回应,但下面的查询应该这样做。
我已经在http://sqlfiddle.com/#!3/07d74/5
创建了一个在线的sqlfiddle您可以使用上述在线sqlfiddle验证您的要求。它提供了与您要求的完全相同的结果。
即使经过大量的谷歌搜索,我找不到用于运行DB2查询的在线工具,但是我在查询之前检查了IBM关于交叉连接和左连接的DB2语法的文档。因此,它应该在DB2中工作,但如果您发现任何问题,请告诉我。 如果您了解DB2的在线工具,请告诉我。 sqlfiddle基于Sql Server,因为sqlfiddle上没有DB2的选项,但就像我说的那样,根据我阅读的文档,查询与DB2兼容。
DB2兼容查询如下所示。
SELECT D.id,
D.age
FROM C
LEFT OUTER JOIN
(SELECT A.id,
B.age
FROM A
CROSS JOIN B) D ON D.id = C.id
AND D.age = C.age;
答案 3 :(得分:-1)
对于不完整且不正确的“FULL JOIN”帖子感到抱歉。
不是吗:
select case when b.age is not null then a.id end as id
, case when a.id is not null then b.age end as age
from c
left join a on a.id = c.id
left join b on b.age = c.age