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

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

新規登録して質問してみよう
ただいま回答率
85.49%
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

解決済

2回答

7044閲覧

SQLでSELECT文を再利用したい

ecaepazo

総合スコア25

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クリップ

投稿2016/01/13 01:14

table_A から SQL_2 から取得される 「dateTime] を条件にSELECTしたいです。
単純に言えば、 [2016/01/01] の箇所に SQL_2 を副問合せとして入れればよいのですが、
省略する方法(SQL_2を再利用するような方法)がありましたらご教授ください。
よろしくお願い致します。

sql

1-- SQL_1 2SELECT 3 * 4FROM 5 table_A 6WHERE 7 dateTime1 < [2016/01/01] 8UNION 9SELECT 10 * 11FROM 12 table_A 13WHERE 14 dateTime2 < [2016/01/01] 15 AND ( 16 dateTime1 is null 17 OR dateTime1 < [2016/01/01] 18 ) 19INTERSECT 20SELECT 21 * 22FROM 23 table_A A 24WHERE 25 A.col2 = ( 26 SELECT 27 B.col1 28 FROM 29 table_B B 30 WHERE 31 B.col1 = A.col2 32 AND B.date <= [2016/01/01] 33 )

sql

1-- SQL_2 2SELECT 3 dateTime 4FROM 5 table_A A , 6 table_C C 7WHERE 8 A.col3 = C.col1 9

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

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

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

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

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

guest

回答2

0

ベストアンサー

WITH句を使えば再利用可能です。
が・・・・SQL2の検索結果は単一の値を返しますか?複数の値が返却されると動かないかと思います。。

sql

1WITH SQL2 AS ( SELECT dateTime FROM table_A A , table_B B WHERE A.col3 = C.col1) 2 3SELECT * FROM table_A 4WHERE dateTime1 < SQL2.dateTime 5UNION 6SELECT * FROM table_A 7WHERE dateTime2 < SQL2.dateTime 8 AND ( 9 dateTime1 is null 10 OR dateTime1 < SQL2.dateTime 11 ) 12INTERSECT 13SELECT * FROM table_A A 14WHERE A.col2 = ( 15 SELECT B.col1 FROM table_B B 16 WHERE 17 B.col1 = A.col2 18 AND B.date <= SQL2.dateTime 19 ) 20

投稿2016/01/13 01:56

Toyoshima

総合スコア422

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

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

ecaepazo

2016/01/13 02:13

早速の回答ありがとうございます。 WITH句で実現できました。 SQL2の検索結果については、複数の値が返されていましたが、WITH句のWHERE句をSELECT文に定義することで解決できました。
guest

0

Toyoshima さんの回答を元に以下SQLにて解決しました。

sql

1WITH SQL2 AS (SELECT seqNo, dateTime FROM table_C C) 2 3SELECT * 4FROM table_A A 5WHERE dateTime1 < ( SELECT dateTime 6 FROM SQL2 7 WHERE A.seqNo = SQL2.seqNo ) 8UNION 9SELECT * 10FROM table_A A 11WHERE dateTime2 < ( SELECT dateTime 12 FROM SQL2 13 WHERE A.seqNo = SQL2.seqNo ) 14 AND ( dateTime1 is null 15 OR dateTime1 < ( SELECT dateTime 16 FROM SQL2 17 WHERE A.seqNo = SQL2.seqNo ) 18 ) 19INTERSECT 20SELECT * 21FROM table_A A 22WHERE A.col2 = ( 23 SELECT B.col1 24 FROM table_B B 25 WHERE B.col1 = A.col2 26 AND B.date <= ( SELECT dateTime 27 FROM SQL2 28 WHERE A.seqNo = SQL2.seqNo ) 29 )

投稿2016/01/13 02:21

編集2016/01/13 02:23
ecaepazo

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問