アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になってます。

データの結合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になります。

以上、つたない説明ですが、よい手がありましたら、ご指摘お願いします。

A 回答 (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式を組み合わせる方法なども有ると思います。

参考URL:http://codezine.jp/article/detail/751?p=1
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

回答のSQLで実現できました。
参考URLの内容も興味深いものでした。

勉強させていただきます。

お礼日時:2009/12/07 22:11

本当にこれだけの条件なら以下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
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

なるほど、leftでつなげていくのですね。
これも実現できそうですね。

>しかし、tbl2を2回読むのは、あまり嬉しくない作りです。
>必ず2件あるならtbl2にc1とc2でカラムを持たせた方が良いと思います。

まったくご指摘の通りだとおもうのですが、もうすでにシステムが組まれており、変更不可な状態です。
ですので、すこしでも、読む方を早くなるように模索中な状態でした。
ありがとうございました。

お礼日時:2009/12/07 22:15

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

関連するカテゴリからQ&Aを探す