質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

1735閲覧

SQL:テーブル結合の条件分岐

DomDom

総合スコア9

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/09/10 00:47

前提・実現したいこと

前提として

テーブルAとテーブルBを INNER JOIN した「テーブルAB」
テーブルABと LEFT JOIN したいテーブル「テーブルC1~C5」

があります。

テーブルABの項目〇〇が1の場合はテーブルC1、
2の場合はテーブルC2…のように結合し、最終的に

テーブルAB.項目〇〇
テーブルAB.項目××
テーブルC(1~5).項目△△

のように出力したいです。

試したこと

テーブルC1~C5を UNION ALL すれば
実現自体はしましたが、件数の関係で
非常にパフォーマンスが悪くなりました。

上記仕様の実装とパフォーマンスを両立させる方法は
ないものでしょうか。
ご存知の方がいらしたら、回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/09/10 01:09

DBMSが不明です。タグを追加して下さい。また、現状のSQLを質問に追記したほうが的確な回答が得られると思います。
DomDom

2018/09/10 01:21

大変失礼しました。DBMSは、Windows環境下の「Oracle Database 11g」になります。
sazi

2018/09/10 01:44

タグ編集でお願いします。後は現状のSQLですね。
Orlofsky

2018/09/10 01:46

質問にCREATE TABLE文も載せてください。
sazi

2018/09/10 02:22

union しなければ早くなると思うんですけど、SQLの提示がなければ、条件が〇〇=1みたいな回答になっちゃうけど良いんですか?
guest

回答4

0

ベストアンサー

テーブルC(1~5)とテーブルABの結合条件は不明なので適当です。
結合の条件に、項目〇〇=XXを加えるのがポイントです。

SQL

1select AB.項目〇〇, AB.項目×× 2 , coalesce(c1.項目△△, c2.項目△△, c3.項目△△, c4.項目△△, c5.項目△△) as 項目△△ 3from テーブルAB as ab 4 left join テーブルC1 as c1 on 項目××=c1.ID and ab.項目〇〇=1 5 left join テーブルC2 as c2 on 項目××=c2.ID and ab.項目〇〇=2 6 left join テーブルC3 as c3 on 項目××=c3.ID and ab.項目〇〇=3 7 left join テーブルC4 as c4 on 項目××=c4.ID and ab.項目〇〇=4 8 left join テーブルC5 as c5 on 項目××=c5.ID and ab.項目〇〇=5

投稿2018/09/10 03:40

編集2018/09/10 03:42
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

仕様とボトルネックが今一つわかりませんが早くなるかもでよければ。。。
ABのデータ量がごく少量 かつ Cへユニーク検索できる ならCのデータ量による遅延はある程度軽減できるかもしれません。

SQL

1SELECT 2 AB.項目○○ AS 項目○○, 3 AB.項目×× AS 項目×× 4 CASE AB.項目○○ 5 WHEN 1 THEN (SELECT 項目△△ FROM テーブルC1 WHERE PKey = AB.条件) 6 WHEN 2 THEN (SELECT 項目△△ FROM テーブルC2 WHERE PKey = AB.条件) 7 WHEN 3 THEN (SELECT 項目△△ FROM テーブルC3 WHERE PKey = AB.条件) 8 WHEN 4 THEN (SELECT 項目△△ FROM テーブルC4 WHERE PKey = AB.条件) 9 WHEN 5 THEN (SELECT 項目△△ FROM テーブルC5 WHERE PKey = AB.条件) 10 END AS 項目△△ 11FROM 12 テーブルA INNER JOIN テーブルB ON13

※ データの内容次第で壊れたり遅くなる脆いクエリです
どうなると動かなくなる、遅くなるかがわかっていれば逃げ方の一例まで。。。

投稿2018/09/10 07:17

Satsuki_2981

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

インデックスの状況にもよりますが
先にleft joinした結果をselect allした方がよいかもしれません。

投稿2018/09/10 02:02

yambejp

総合スコア114747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

データベースエンジンもスキーマもわからないので確定的なことは言えませんが、全部バラバラにLEFT JOINした上で、「テーブルC(1~5).項目△△」だけCOALESCEで取る、というのはどうでしょうか。

SQL

1SELECT 2COALESCE(table_c_1.column,table_c_2.column,table_c_3.column,table_c_4.column,table_c_4.column) AS result 3FROM 4(((table_a INNER JOIN table_b) 5LEFT JOIN table_c_1 条件) 6LEFT JOIN table_c_2 条件) 7-- あとは同様に

投稿2018/09/10 00:57

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問