0

我有三个表 AB 和 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

4 回答 4

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

还有更多可能的组合......

于 2013-02-28T16:49:07.407 回答
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
于 2013-02-28T23:22:06.957 回答
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;
于 2017-03-26T05:43:41.580 回答
-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
于 2013-02-28T16:48:47.687 回答