下記ロジックを満たすSQL(SELECT)を教えていただけますでしょうか。
データベースタイプはオラクルとなっております。
今入力値として、入力1:SY番号 , 入力2 : 出力数
があるものとします。
ここでは説明のため、仮にSY番号が"sy1" 出力数が"1"とします。
ロジック1:テーブルAから入力1にヒットするSE番号を取得
(例:se1取得)
【テーブルA】
SY番号、SE番号
sy1 、se1
sy2 、se2
sy3 、se3
ロジック2:テーブルBからロジック1で取得したSE番号に対応したZU番号を取得
(例:zu1取得)
【テーブルB】
SE番号、ZU番号
se1 、zu1
se2 、zu1
se3 、zu1
se4 、zu2
se5 、zu2
se6 、zu2
ロジック3:テーブルCからロジック1で取得したSE番号に対応した最大DT(大きいほうのレコード値)を取得
(例:1/3 10:10:12)
【テーブルC】
ID 、SE番号、DT
1101 、 se3 、1/1 10:10:10
1102 、 se3 、1/1 10:10:10
1201 、 se2 、1/2 10:10:11
1202 、 se2 、1/2 10:10:11
1301 、 se1 、1/3 10:10:12
1302 、 se1 、1/3 10:10:12
1401 、 se5 、1/4 10:10:13
1402 、 se5 、1/4 10:10:13
1501 、 se4 、1/5 10:10:14
1502 、 se4 、1/5 10:10:14
1601 、 se6 、1/6 10:10:15
1602 、 se6 、1/6 10:10:15
ロジック4:テーブルBからロジック2で取得したZU番号に対応した全SE番号を取得
(例:se1,se2,se3を取得)
【テーブルB】
SE番号、ZU番号
se1 、zu1
se2 、zu1
se3 、zu1
se4 、zu2
se5 、zu2
se6 、zu2
ロジック5:テーブルCからロジック4で取得した各SE番号に対応した最大DT(大きいほうのレコード値)を取得
(例:1/1 10:10:10,1/2 10:10:11,1/3 10:10:12を取得)
【テーブルC】
ID 、SE番号、DT
1101 、 se3 、1/1 10:10:10
1102 、 se3 、1/1 10:10:10
1201 、 se2 、1/2 10:10:11
1202 、 se2 、1/2 10:10:11
1301 、 se1 、1/3 10:10:12
1302 、 se1 、1/3 10:10:12
1401 、 se5 、1/4 10:10:13
1402 、 se5 、1/4 10:10:13
1501 、 se4 、1/5 10:10:14
1502 、 se4 、1/5 10:10:14
1601 、 se6 、1/6 10:10:15
1602 、 se6 、1/6 10:10:15
ロジック6:ロジック5で取得した各DTをロジック3で取得したDTを基準にしてそれよりも
前の日時の各DTを取得する。
(例:1/1 10:10:10,1/2 10:10:11取得)
ロジック7:ロジック6で取得した各DTを昇順でソートする。
(例:1/1 10:10:10,1/2 10:10:11)
ロジック8:ロジック7でソートした各DTの中から、ロジック3で取得したDTから近い順に
見て、入力2の出力数の数だけ選択及び取得する
(例:1/2 10:10:11を取得)
ロジック9:ロジック8で取得した各DTに紐付いたSE番号をテーブルCより取得
(例:SE2を取得)
かなり細かく段階を分けてロジックを書いておりますが、効率よくまとめてSQLを記述するとなると、おそらくですがどこかのロジックは短縮又は不要になったりするかとおもいます。
その辺りを含めまして最も効率よく一度のSQL文だけでSELECTできるSELECT文を記述して教えていただけますでしょうか。
おそらくサブクエリを使用すると思いますが、サブクエリ数も最低限の数だけ使用するなど工夫をいただけると幸いです。
以上、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/21 23:31
2015/06/22 10:50
2015/06/22 13:12
2015/06/23 12:06