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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

Q&A

3回答

546閲覧

Oracle SQL カラムAの値が9だった場合のみ、結合条件を追加したい

yamadait

総合スコア6

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

0グッド

0クリップ

投稿2019/09/19 14:38

前提・実現したいこと

3つのテーブルを結合して作成したを「合体テーブル」
結合させたい軸のテーブルを「軸テーブル」
軸テーブルに一致したレコードを外部結合させたい「結合テーブル」
とします。

「軸テーブル」のカラムCの値が'09'だった場合のみ
Cの結合条件を追加したいです。

結合テーブルはカラムA、Bが主キーの複合型です。

書き方を職場で統一しているので、できるだけこれに近い書き方で解決できたら幸いです。
・結合はJOIN句ではなくWHERE句
・外部結合は(+)で表現する

発生している問題・エラーメッセージ

ORA-00905

該当のソースコード

SQL

1SELECT * 2 3FROM 軸テーブル, 結合テーブル1 4 5WHERE 軸テーブル.A = 結合テーブル1.A(+) 6AND 軸テーブル.B = 結合テーブル1.B(+) 7AND (CASE WHEN 軸テーブル.C = '09' THEN 軸テーブル.C = 結合テーブル1.C(+) 8 ELSE --軸テーブル.Cが<>'09'の場合は、この条件は無視したい 9 END)

試したこと

WHEREの横にCASE文を置いて、条件全体で分けたり、JOIN ON句の結合条件で試してみましたが、
ダメでした。

私のSQLの理解度があまり高くなく、条件分岐以外での実現方法が思いつきません。
CASE以外でも実現方法があれば教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

環境(足りない部分は教えてください)
windows7
oracle 11g
オブジェクトブラウザ10

また職場が外部のネットワークにアクセスできないため、思い出しながらの記述となっています。
ミスがあれば修正します。

一部の解決できない部分を抽出していますが、
実際のSQL文は、2重のサブクエリを用いた150行ほどのものになっています。
教えていただいた方法で解決できなかった場合は、そちらの部分も記述します。

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

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

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

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

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

guest

回答3

0

軸テーブル.C = '09' のものと、そうでないものを分けて UNION ALL

SQL

1SELECT * 2FROM 軸テーブル, 結合テーブル1 3WHERE 4 軸テーブル.A = 結合テーブル1.A(+) 5AND 軸テーブル.B = 結合テーブル1.B(+) 6AND 軸テーブル.C = '09' 7AND 軸テーブル.C = 結合テーブル1.C(+) 8UNION ALL 9SELECT * 10FROM 軸テーブル, 結合テーブル1 11WHERE 12 軸テーブル.A = 結合テーブル1.A(+) 13AND 軸テーブル.B = 結合テーブル1.B(+) 14AND (軸テーブル.C != '09' OR 軸テーブル.C IS NULL)

LEFT JOIN を使うと楽なんですけどね・・

SQL

1SELECT * 2FROM 軸テーブル LEFT JOIN 結合テーブル1 3ON 4 軸テーブル.A = 結合テーブル1.A 5AND 軸テーブル.B = 結合テーブル1.B 6AND ( 7 (軸テーブル.C = '09' AND 軸テーブル.C = 結合テーブル1.C) 8 OR 9 (軸テーブル.C != '09' OR 軸テーブル.C IS NULL) 10)

投稿2019/09/20 01:17

KOZ6.0

総合スコア2622

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

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

0

case文中で(+)使えたかどうかは未検証です。

SQL

1AND 軸テーブル.C 2 = CASE WHEN 軸テーブル.C = '09' THEN 結合テーブル1.C(+) else 軸テーブル.C end

書き方を職場で統一しているので、できるだけこれに近い書き方で解決できたら幸いです。
・結合はJOIN句ではなくWHERE句
・外部結合は(+)で表現する

oracle自身もjoinを推奨していますし、その規約は見直した方が良いかと思います。

投稿2019/09/20 01:00

編集2019/09/20 01:14
sazi

総合スコア25138

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

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

0

ELSE で何もしないときはELSEは記述しません。だけど、AND の中のCASEって不安な気もするので、

SQL

1SELECT * 2FROM 軸テーブル, 結合テーブル1 3WHERE 軸テーブル.A = 結合テーブル1.A(+) 4AND 軸テーブル.B = 結合テーブル1.B(+) 5AND CASE WHEN 軸テーブル.C = '09' THEN 軸テーブル.C = 結合テーブル1.C(+) 6 ELSE 軸テーブル.A = 結合テーブル1.A(+) -- この行は不要かも? 7 END

質問に 2つのテーブルのCREATE TABLE文とデータを何件がINSERT文で、希望するSELECT 結果を Markdown の [コード] で追記できると適切なコメントが付き易いです。

また職場が外部のネットワークにアクセスできないため

その辺も職場を選ぶ選択肢のひとつとして考えましょう。

投稿2019/09/19 15:03

編集2019/09/19 16:01
Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問