下記のようなテーブルがあり、
マスタの方は「*」が入っていれば、デフォルト行のような扱いをしたいのです。
・テーブルの1のデータはマスタのAと完全マッチしているので、Aの行の値が欲しい。
・テーブルの2のデータはマスタと完全一致はしないが、列4が「*」なのでBの行の値が欲しい。
・テーブルの3のデータはマスタと完全一致はしないが、列3と列4が「*」なので、Cの行の値が欲しい。
現在は、マスタを別名で完全一致用(m1)、列4が「*」用(m2)、列3と列4が「*」用(m3)の3つをFrom句に記述し、
Select句にて、m1がNULLなら、m2から取得、m2もNULLならm3から取得するというやり方をとっていますが、
実際の「*」がある組み合わせがたくさんあり、それだけインラインビューを用意すると遅くなっているので、
なんとかインラインビュー1つでなんとかならないものでしょうか?
テーブル
┌─┬──┬──┬─┐
│01│AAAA│X001│YY│←1
├─┼──┼──┼─┤
│01│AAAA│X001│ZZ│←2
├─┼──┼──┼─┤
│01│AAAA│X002│YY│←3
└─┴──┴──┴─┘
マスタ
┌─┬──┬──┬─┐
│01│AAAA│X001│YY│←A
├─┼──┼──┼─┤
│01│AAAA│X001│* │←B
├─┼──┼──┼─┤
│01│AAAA│* │* │←C
└─┴──┴──┴─┘
No.3ベストアンサー
- 回答日時:
一致する項目の数で、レコードを選択すれば良いと思うので、
select T1,T2,T3,T4,M1,M2,M3,M4
from
(
select T.*,Mx.*,row_number() over(partition by T1,T2,T3,T4 order by CNT) R
from テーブル T,
(
select M1,M2,M3,M4,
decode(M1,'*',1,0)+decode(M2,'*',1,0)+decode(M3,'*',1,0)+decode(M4,'*',1,0) as CNT
from マスタ M
) Mx
where
decode(M1,T1,1,'*',1,0)=1 and
decode(M2,T2,1,'*',1,0)=1 and
decode(M3,T3,1,'*',1,0)=1 and
decode(M4,T4,1,'*',1,0)=1
)
where R=1
とか。
まさにやりたいことができました!
実際に組み込みたいSQLは巨大で複雑なものですが、
試してみたいと思います。
ありがとうございました。
No.2
- 回答日時:
すでに#1のSQLに準ずるものになっているのであれば、キーにインデックスが無いとかはありませんか?
蛇足
インラインビューとは普通以下のようなものを指すを思います。今回のSQLは単に同一テーブルの複数回結合です。マスタにユニークインデックスが適切に作成されていれば、通常マスタが原因で遅くなるとは思えないのですが・・・
select a.*, b.* from (
select * from table1 where key = 1
) a, table2 b
where a.key = b.key
コメントありがとうございます。
実際、該当するSQLをオブジェクトブラウザ等で実行すると、
100件ほどなのに、15秒ほどかかり、
マスタを複数回結合しているのをやめると、4秒になりました。
マスタにはユニークが設定されていますが、
複数回結合の相手が大きなViewのため、それで遅いのかも知れません。
No.1
- 回答日時:
この手の質問は試行したSQLを書かないと、アドバイスが付きにくいと思います。
ざっと考えてこんなSQLでイケるのでわないかと・・・データ部の情報がないので、そのあたりはテキトーです。
select case when マスタ1.データ is not null then マスタ1.データ
when マスタ2.データ is not null then マスタ2.データ
else マスタ3.データ end as "データ"
from テーブル, マスタ マスタ1, マスタ マスタ2, マスタ マスタ3
where マスタ1.列1(+) = テーブル.列1 and マスタ1.列2(+) = テーブル.列2
and マスタ1.列3(+) = テーブル.列3 and マスタ1.列4(+) = テーブル.列4
and マスタ2.列1(+) = テーブル.列1 and マスタ2.列2(+) = テーブル.列2
and マスタ2.列3(+) = テーブル.列3 and マスタ2.列4(+) = '*'
and マスタ3.列1(+) = テーブル.列1 and マスタ3.列2(+) = テーブル.列2
and マスタ3.列3(+) = '*' and マスタ3.列4(+) = '*'
回答ありがとうございます。
>現在は、マスタを別名で完全一致用(m1)、列4が「*」用(m2)、列3と列4が「*」用(m3)の3つをFrom句に記述し、
>Select句にて、m1がNULLなら、m2から取得、m2もNULLならm3から取得するというやり方をとっていますが、
>実際の「*」がある組み合わせがたくさんあり、それだけインラインビューを用意すると遅くなっているので、
>なんとかインラインビュー1つでなんとかならないものでしょうか?
上記で伝えた気になっていました。
わかりにくくて申し訳ありません。
現状はまさしく回答して頂いた通りなのですが、
マスタを別名で何個も宣言しているので、
これが1個にならないか?という質問でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- Visual Basic(VBA) VBA 最終行まで数式をコピーする 3 2023/01/03 15:44
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オラクルSQLの累計値取得方法に...
-
ORA-01722: 数値が無効です
-
改行コードを削除して取得する...
-
SQL抽出方法:売上Tを集計した...
-
SQLでグループ化した結果の件数...
-
Accessで期間指定の売上合計と...
-
SQL文のエラーについて
-
SQL文(県名一覧・・)
-
Oracleでテーブルの結合について
-
SQL文 2つのテーブルから、グ...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
Excel→Accessへ貼り付けがおかしい
-
Accessでテーブル名やクエリ名...
-
ACCESSのクエリで集計で、先頭...
-
変数が選択リストにありません
-
INSERT INTO ステートメントに...
-
Accessクエリーで両方のテーブ...
-
Accessでテーブルの値をテキス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLでグループ化した結果の件数...
-
ORA-01722: 数値が無効です
-
項目名の制限について
-
MySQLで改行を含む文の登録のし...
-
フォームで検索 エラーの表示...
-
オラクルSQLの累計値取得方法に...
-
列名無効について
-
【 困 】 ストアドプロシージャ
-
Accessで期間指定の売上合計と...
-
♪Oracle SQL 処理が成功した時...
-
アクセスのクエリについて(前...
-
外部結合のSQLの書き方について
-
SQL文 2つのテーブルから、グ...
-
Accessで複数テーブルのJoin
-
SQLを教えてください
-
各店舗毎の最大売上の項目を取...
-
SQLを教えて下さい
-
以下のようなSQLについて教えて...
-
特殊なレコードの取得方法
-
改行コードを削除して取得する...
おすすめ情報