如何将外连接从两个表保留到第三个表

时间:2013-02-28 16:43:15

标签: sql db2 outer-join

我有三张桌子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 * =外连接语法中如何做到这一点,但我看不出如何以新风格的方式做到这一点。 这甚至可能吗?

有人建议加入一半的结果。工会只是搞得一团糟,在我看来,我应该可以从两个表中做一个左外连接。

帮助? 感谢。

4 个答案:

答案 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