dポイントプレゼントキャンペーン実施中!

テーブルの結合についてお聞きしたいことがあります。
カラム「KEY」を結合条件に
テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。
しかし、テーブルAにBとCをLEFT JOINを結合した所、
【取得された結果】のデータが取得されました。
どのような結合をしたら期待通りの結果が得られるのでしょうか?
回答宜しくお願いします。

【取得された結果】
key dataA dataB dataC
-------------------------------------------------
1 A-1 B-1 C-1
A-1 B-1 C-2
A-1 B-1 C-3
2 A-2
3 A-3

【取りたい結果】
key dataA dataB dataC
-------------------------------------------------
1 A-1 B-1 C-1
A-1 C-2
A-1 C-3
2 A-2
3 A-3

【テーブルA】
key dataA
---------------------
1 A-1
2 A-2
3 A-3



【テーブルB】
key dataB
---------------------
1 B-1

【テーブルC】
key dataC
---------------------
1 C-1
1 C-2
1 C-3

A 回答 (2件)

ANo1 です。

補足です。
とりたい結果に【テーブルA】は重複してでていますが、
もし出したくないのなら。

select key,max(dataA),max(dataB),max(dataC) from
(
select key,dataA,Null as dataB,Null as dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataA) rn,key as keydmy
from 【テーブルA】a
union
select key,Null as dataA,dataB,Null as dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataB) rn,key as keydmy
from 【テーブルB】
union
select key,Null as dataA,Null as dataB,dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataB) rn,key as keydmy
from 【テーブルC】
)
group by keydmy,key,rn
order by keydmy,rn

※とりたい結果には、keyが出ていない行がありますが、【テーブルA】が1行しかないときに
出さないのか、【テーブルA】【テーブルB】【テーブルC】どれかが複数行あるときに出さない
のか?それによってやり方は変わります。
    • good
    • 0

select key,dataA from 【テーブルA】a


left outer join
(
select key,max(dataB),max(dataC) from
(
select key,dataB,Null as dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataB) rn from 【テーブルB】
union
select key,Null as dataB,dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataC) rn from 【テーブルC】
) group by key,rn
) bc
where a.key = bc.key

## unionじゃなくってfull outer join でもできそうですが
## (って、Oracleの命令は別のだったかな?そもそも、Ver書いていないのでこちらは使えるか不明)

なにやっているのか。
select key,dataB,Null as dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataB) rn from 【テーブルB】
select key,Null as dataB,dataC,
ROW_NUMBER() OVER (PARTITION BY key order by dataC) rn from 【テーブルC】
はそれぞれ
【テーブルB】
key dataB rn
---------------------
1 B-1 1

【テーブルC】
key dataC rn
---------------------
1 C-1 1
1 C-2 2
1 C-3 3
を作ってます。
(select key,max(dataB),max(dataC) from
(・・・
) group by key,rn
) bc

【テーブルBC】(rn)は項目としてないけど。
key dataB dataC (rn)
---------------------
1 B-1 C-1 1
1   C-2 2
1   C-3 3
を作っています。
これと【テーブルA】を結合すると望みに近いものが出るでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!