質問: 複数の表を一つにしたい oracle7で以下のような要求にあうようなsqlは可能でしょうか? 見積データ データno 品目 金額 1 ああ 1o 2 いい 11 3 うう 12 受注データ データno 品目 金額 2 いい 11 3 ええ 13 4 おお 14 納品データ データno 品目 金額 3 かか 15 4 おお 14 5 きき 16 上記のような3つのテーブルがあります。 データnoは、見積データ作成時に連番になり、受注、納品のデータnoはその番号を引き継ぎます。 ところが、受注データからしか発生しないデータもあり、同様に納品データから発生する場合もあります。 (ちゃんと見積もりしてから受注して納品ではなく、いきなり受注したり納品したりする場合があるので) また、見積時とは明細がことなる場合もあります。 データnoでそれらを追いたいので、この3つの表を以下のような結果にしたいのです。 結果テーブル データno 見積品目 見積金額 受注品目 受注金額 納品品目 納品金額 1 ああ 10 2 いい 11 いい 11 3 うう 12 ええ 13 かか 15 4 おお 14 おお 14 5 きき 16 レイアウトや説明がわかりずらいかと思いますが、よろしくお願いします。
回答: 古いオラクルだと、こんな感じで書くのが良いでしょう。 --外部結合による解決 select x.データno,a.品目,a.金額,b.品目,b.金額,c.品目,c.金額 from 見積 a,受注 b,納品 c, (select データno from 見積 union select データno from 受注 union select データno from 納品) x where x.データno=a.データno(+) and x.データno=b.データno(+) and x.データno=c.データno(+); --外部結合を使わない解決 select データno, max(decode(k,1,品目,null)),max((decode(k,1,金額)), max(decode(k,2,品目,null)),max((decode(k,2,金額)), max(decode(k,3,品目,null)),max((decode(k,3,金額)) from (select 1 as k,a.* from 見積 a union all select 2 as k,b.* from 受注 b union all select 3 as k,c.* from 納品 c) group by データno;