- ベストアンサー
正規化?の戻しについて
お世話になってます。 データの結合SQLについて教えてください。 以下の2つのテーブルがあります。 <TBL1> KEY A B --- -- -- 111 A1 B1 222 A2 B2 333 A3 B3 <TBL2> KEY COL C --- --- -- 111 1 AA 111 2 BB 222 1 CC 222 2 DD 333 1 EE 333 2 FF 正規化?を行った結果このようになったようなのですが、運用では下記イメージで利用してます。 KEY A B C1 C2 --- -- -- -- -- 111 A1 B1 AA BB 222 A2 B2 CC DD 333 A3 B3 EE FF TBL1とTBL2から、このイメージを取り出すために前任者がPL/SQLの複雑なロジックで実現しているのですが、処理が遅い状態です。 SQLのみで実現できれば、もう少し早くなるのでは?と考えております。 いろいろ考えてみましたが実現方法が思いつかないため、お知恵をお貸しください。 TBL1は特に規則性もない普通のテーブルです。 TBL2は、TBL1のキーが必ず存在します。 COLは、キーごとに1,2が固定で設定されます。結合イメージのC1,C2項目に該当します。 TBL2の件数はTBL1件数*2になります。 以上、つたない説明ですが、よい手がありましたら、ご指摘お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SELECT句内のサブクエリが使えばよろしいかと。 例) -------------------------------------------------------------- SELECT t1.KEY, A, B, (SELECT C FROM TBL2 t2 WHERE t1.KEY = t2.KEY AND COL = 1) AS C1, (SELECT C FROM TBL2 t3 WHERE t1.KEY = t3.KEY AND COL = 2) AS C2 FROM TBL1 t1 ------------------------------------------------------------------ 他にも GROUP BY して集約関数とCASE式を組み合わせる方法なども有ると思います。
その他の回答 (1)
- 3rd_001
- ベストアンサー率66% (115/174)
本当にこれだけの条件なら以下SQLで十分だと思います。 ちゃんとキー項目に索引がついていればパフォーマンスもそれほど悪くないと思います。 しかし、tbl2を2回読むのは、あまり嬉しくない作りです。 必ず2件あるならtbl2にc1とc2でカラムを持たせた方が良いと思います。 create table tbl1 ( key varchar2(3), a varchar2(3), b varchar2(3) ); create table tbl2 ( key varchar2(3), col varchar2(3), c varchar2(3) ); insert into tbl1 values('111','A1','B1'); insert into tbl1 values('222','A2','B2'); insert into tbl1 values('333','A3','B3'); insert into tbl2 values('111','1','AA'); insert into tbl2 values('111','2','BB'); insert into tbl2 values('222','1','CC'); insert into tbl2 values('222','2','DD'); insert into tbl2 values('333','1','EE'); insert into tbl2 values('333','2','FF'); select tab_ab.key, tab_ab.a, tab_ab.b, tab_c1.c, tab_c2.c from tbl1 tab_ab left outer join tbl2 tab_c1 on tab_ab.key = tab_c1.key and tab_c1.col = '1' left outer join tbl2 tab_c2 on tab_ab.key = tab_c2.key and tab_c2.col = '2' order by tab_ab.key ; KEY A B C C --- --- --- --- --- 111 A1 B1 AA BB 222 A2 B2 CC DD 333 A3 B3 EE FF
お礼
回答ありがとうございます! なるほど、leftでつなげていくのですね。 これも実現できそうですね。 >しかし、tbl2を2回読むのは、あまり嬉しくない作りです。 >必ず2件あるならtbl2にc1とc2でカラムを持たせた方が良いと思います。 まったくご指摘の通りだとおもうのですが、もうすでにシステムが組まれており、変更不可な状態です。 ですので、すこしでも、読む方を早くなるように模索中な状態でした。 ありがとうございました。
お礼
回答ありがとうございます! 回答のSQLで実現できました。 参考URLの内容も興味深いものでした。 勉強させていただきます。