お世話になってます。
データの結合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になります。
以上、つたない説明ですが、よい手がありましたら、ご指摘お願いします。
No.1ベストアンサー
- 回答日時:
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
No.2
- 回答日時:
本当にこれだけの条件なら以下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でカラムを持たせた方が良いと思います。
まったくご指摘の通りだとおもうのですが、もうすでにシステムが組まれており、変更不可な状態です。
ですので、すこしでも、読む方を早くなるように模索中な状態でした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- Excel(エクセル) Excel同士のデータの突合 3 2023/08/07 16:34
- 格安スマホ・SIMフリースマホ SIMフリースマホ(Android限定)米国で通話ができる実売3万円台の電池が持つ端末はないですか? 6 2022/11/12 11:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Date型にNULLをセットしたい V...
-
SELECTで1件のみ取得するには?
-
☆☆☆☆SQL Olacle 3つ以上の文字...
-
異なるDB間でのJOINやVIEWについて
-
SQL>UPDATEと同時にその件数を...
-
sqlplusの処理が途中でとまる
-
GROUP BYを使ったSELECT文の総...
-
実績累計の求め方と意味を教え...
-
SQL文で素早くNULLを除外する方法
-
GROUP BYを行った後に結合した...
-
固定値を含む結合と複数テーブ...
-
キーが同じを複数行を1行にま...
-
DATE型にNULLをセットするには?
-
Accessで別テーブルの値をフォ...
-
unionの結果は集計はできないで...
-
SELECTの結果で同一行を複数回...
-
select句副問い合わせ 値の個...
-
Access でレコードセレクタが押...
-
ワードの差込印刷で教えて下さ...
-
【初歩】ラジオボタンをつかっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECTで1件のみ取得するには?
-
Date型にNULLをセットしたい V...
-
SQL>UPDATEと同時にその件数を...
-
oracleのinsert select性能
-
sqlplusの処理が途中でとまる
-
ACCESSのSQLの書き方
-
異なるDB間でのJOINやVIEWについて
-
プロシージャで変数をテーブル...
-
SELECTでの指定行からの指定行...
-
ORDER BY 半角カナ
-
☆☆☆☆SQL Olacle 3つ以上の文字...
-
AccessVBAでリンクテーブルの参...
-
ACCESSとORACLEで抽出結果が異なる
-
PostgreSQLで小数点以下を処理...
-
オラクル オブジェクトのデー...
-
正規化?の戻しについて
-
取得するデータの件数指定、MyS...
-
SQLで抽出可能でしょうか?
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
おすすめ情報