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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

Q&A

解決済

3回答

9393閲覧

Oracle/SQLで同じSQL文を2度書かない方法

hiviyan

総合スコア22

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

0グッド

3クリップ

投稿2015/09/29 04:10

いつもお世話になっております。

さて、以下の様なSQL文があります。

ある結構長いSQLをt1、t2として自己結合をするという内容なのです。SQL自体は正常に走ります。

質問したいのは、"select * from TABLE_1 where ID = 100"とありますが、例えば、"ID"を90に変えると、2箇所変更が必要となります。今後メンテする際に2箇所同じものを変えるのが面倒なのですが、他に良い方法はありますでしょうか?

SELECT t1.*, t2.* FROM ( --本当はもっと長いSQL文 select * from TABLE_1 where ID = 100 ) t1 join ( --本当はもっと長いSQL文 select * from TABLE_1 where ID = 100 ) t2 on t1.ID = t2.ID

こんな感じでt2を作成する際にt1を参照できればいいのですが、できないようです。

SELECT t1.*, t2.* FROM ( --本当はもっと長いSQL文 select * from TABLE_1 where ID = 100 ) t1 join ( --本当はもっと長いSQL文 select * from t1 ) t2 on t1.ID = t2.ID

よろしくお願い致します。

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

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

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

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

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

Tak1wa

2015/09/29 04:13

SQLPlusなどから実行した時の話ですか、それとも業務アプリケーションなどから発行されるクエリの話でしょうか。
hiviyan

2015/09/29 04:19

SQLPlusなどから実行した時の話でお願い致します。
Tak1wa

2015/09/29 04:20

本件はパラメータ化の話でしょうか。それとも同一クエリ文を省略する話でしょうか。
hiviyan

2015/09/29 04:29

同一クエリ文を省略できればと思っています。よろしくお願い致します。
Tak1wa

2015/09/29 04:30

algさんが回答されているようにWith句を使うのが適切だと思います。
hiviyan

2015/09/29 04:30

自己レスになりますが、Oracleにはwith句というものがあるようです。これが良さそうなので、これで試してみます。よろしくお願い致します。
guest

回答3

0

ベストアンサー

共通テーブル式(CTE)を使うと良いのではないでしょうか。

sql

1with 2 tbase as ( 3 -- 本当はもっと長いSQL文 4 select * from TABLE_1 where ID=100 5 ) 6select 7 t1.*,t2.* 8from 9 tbase t1 join tbase t2 10on t1.ID=t2.ID

サンプル

投稿2015/09/29 04:22

alg

総合スコア2019

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

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

hiviyan

2015/09/29 05:22

ありがとうございます。with句を試して見たいと思います。
guest

0

このSQLはSQLPlusとかObjectBrowserとかで実行されるSQLでしょうか?
それともアプリケーションから呼び出されるSQLでしょうか?

SQLPlusとかObjectBrowserとかから実行するSQLでしたら、
バインド変数とかが使えるかと思います。
「:変数名」で指定できますよ。

SQL

1SELECT t1.*, t2.* 2FROM 3( 4 --本当はもっと長いSQL文 5 select * from TABLE_1 where ID =:変数名 6 ) t1 join 7( 8 --本当はもっと長いSQL文 9 select * from TABLE_1 where ID =:変数名 10 ) t2 11 12on t1.ID = t2.ID

Oracle SQLPlus PL/SQL 変数(置換変数・バインド変数)の使い方

SQLPlusだとPL/SQLから以下のようにして変数の内容を指定します。

BEGIN :変数名:=100; END

ObjectBrowserだとSQLを実行すると、バインド変数を入力する部分が表示されると思います。

アプリケーションから実行されるSQLの場合でも、
言語に寄りますが、変数と同じような機構があると思います。
(JavaだとPrepareStatementの?とかがソレです。)

投稿2015/09/29 04:50

kaputaros

総合スコア1844

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

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

Tak1wa

2015/09/29 04:53

質問者さんはどうやら同一クエリの省略をしたいそうです。なのでalgさんの回答になるかと。パラメータ化をしたいという場合でPL/SQLを使用できるのであればkapuratosさんが仰っているとおり変数化するのが良さそうですね。
kaputaros

2015/09/29 05:02

なるほど、以下の文を見逃してちょっと勘違いしておりました。 > ある結構長いSQLをt1、t2として自己結合をする Tak1waさんのおっしゃる通りですね^^ ご指摘ありがとうございます!!
guest

0

アプリケーションからcallしますか?
plsql内のSQLでしょうか?
シェルからキックするSQLでしょうか?

環境まわりの情報いただけますとありがたいです。

投稿2015/09/29 04:21

chome0

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問