- 締切済み
テーブル結合について
テーブルの結合についてお聞きしたいことがあります。 カラム「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
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
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】どれかが複数行あるときに出さない のか?それによってやり方は変わります。
- Siegrune
- ベストアンサー率35% (316/895)
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】を結合すると望みに近いものが出るでしょう。