🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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

解決済

1回答

1619閲覧

【SQL】ある条件で結合できなかった時は結合項目を少なくして再度結合したい

退会済みユーザー

退会済みユーザー

総合スコア0

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/12/23 13:40

編集2019/12/23 23:14

前提・実現したいこと

SQLについての質問です。
よろしくお願いします。

SQL

1CREATE TABLE Table1 2 ("column1" varchar2(4) PRIMARY KEY, "column2" varchar2(3) ) 3; 4 5INSERT ALL 6 INTO Table1 ("column1", "column2") 7 VALUES ('REI1', 100) 8 INTO Table1 ("column1", "column2") 9 VALUES ('REI2', 101) 10 INTO Table1 ("column1", "column2") 11 VALUES ('REI3', 102)

SQL

1CREATE TABLE Table2 2 ("column1" varchar2(4), "column2" varchar2(4), "column3" varchar2(10)) 3; 4 5INSERT ALL 6 INTO Table2 ("column1", "column2", "column3") 7 VALUES ('REI1', '100', 'ねこ') 8 INTO Table2 ("column1", "column2", "column3") 9 VALUES ('REI1', '101', 'かめ') 10 INTO Table2 ("column1", "column2", "column3") 11 VALUES ('REI2', NULL, 'いぬ') 12 INTO Table2 ("column1", "column2", "column3") 13 VALUES ('REI3', '200', 'とり') 14 INTO Table2 ("column1", "column2", "column3") 15 VALUES ('REI3', '300', 'へび')

######<Table1>

column1column2
REI1100
REI2101
REI3102

######<Table2>

column1column2column3
REI1100ねこ
REI1101かめ
REI2nullいぬ
REI3200とり
REI3300へび

######<ほしい結果>

column1column3
REI1ねこ
REI2いぬ
REI3とり

ほしい結果を、一回のSQLで得る方法はありますでしょうか。

①column1とcolumn2を結合項目にいれてINNER JOINします。

SQL

1SELECT Table1.column1,column3 FROM Table1 INNER JOIN Table2 ON Table1.column1 = Table2.column1 AND Table1.column2 = Table2.column2)

①のSQLではREI2とREI3のcolumn3が取得できないので、
①で取得できなかった場合、
②REI2とREI3に関しては結合項目を列1のみにしたいです。またREI3については一件のみ取得したいです。

SQL

1SELECT Table1.column1,min(column3) FROM Table1 INNER JOIN Table2 ON Table1.column1 = Table2.column1 GROUP BY Table1.column1 )

以上、SQLで求める結果を得たいのですが良い方法はありますでしょうか?
お手数ですが、ご回答いただければ幸いです。

試したこと

CASE式の中でSELECT文が使用できないか等試してみましたが当然できず、そもそもふつうのSQL文で動的に条件を変化させることはできるのでしょうか。

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

Oracle11gを使用しています。

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

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

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

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

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

Orlofsky

2019/12/23 14:19

プログラマーとしての適正の問題ですが、数字のシングルバイト文字とマルチバイト文字を混在させるのは避けましょう。
Orlofsky

2019/12/23 21:08

INSERT文の余計な改行を削って見易くして、最初の定義やデータの表は削っては?
Orlofsky

2019/12/23 21:09

カラム名をダブルクォーティングするのはどこを参照して書きましたか?意味のないダブルクォーティングは止めましょう。
Orlofsky

2019/12/23 21:16

SQLでは文字列はシングルクォーティングしなければなりませんが、シングルクォーティングされていないところがあります。
Orlofsky

2019/12/23 21:27

マルチバイト文字はSJISでは1文字2バイト、Unicodeでは1文字3バイト(or 4バイト)です。 TABLE2.column3 は桁あふれエラーになりませんか? マナーとしてsqlplusで実行してエラーにならない程度の確認をしてから、質問に載せてください。
guest

回答1

0

ベストアンサー

SQL文で動的に条件を変化させることはできるのでしょうか

動的にSQLが変わるような記述はできません。
動的に条件を変えるという発想ではなく、単なる条件になるように記述するだけです。

単に条件だけで良くするためには、先ずは必要なデータを全て揃えるように考える事です。

SQL

1SELECT T1.column1, coalesce(t2.column3, t3.column3) 2FROM Table1 t1 3 left JOIN Table2 t2 4 ON T1.column1 = T2.column1 AND T1.column2 = T2.column2 5 left join ( 6 select colomn1, column3 7 from Table2 t4 8 where not exists( 9 select 1 from Table2 10 where column1=t4.column1 11 and column2 < coalesce(t4.column2, 0) 12 ) 13 ) t3 14 ON T1.column1 = T3.column1

投稿2019/12/23 18:18

編集2019/12/23 18:21
sazi

総合スコア25327

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

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

退会済みユーザー

退会済みユーザー

2019/12/23 23:15

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問