0

私は3つのテーブル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 に答える
-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 に答える