こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

sqlのwhereで指定した条件の前後を取得したい

テーブル=T)
KEY DATA
001 あ
002 い
003 う
004 え
005 お

SQL)
SELECT DATA FROM T WHERE KEY = 003 ;
上記のSQLでは、「う」のデータしか取得できませんが、
「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。
ちなみに、
SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2

SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1
のUNIONでは上手く行きませんでした。

よろしくお願いします。

投稿日時 - 2011-08-15 14:29:23

QNo.6944222

すぐに回答ほしいです

質問者が選んだベストアンサー

SQLを少し直せば、質問に記載の考え方でもいいと思います。

select data from
(select data from t
where key < '003'
order by key desc)
where rownum = 1
union all
select data from
(select data from t
where key >= '003'
order by key)
where rownum <= 2;

もしくはnot existsを使って、
select data
from t a
where
key = '003'
or not exists (
select *
from t b
where (a.key < '003' and b.key < '003' and a.key < b.key)
or (a.key > '003' and b.key > '003' and a.key > b.key)
);
とかでもいいかもしれません。

投稿日時 - 2011-08-15 15:16:30

お礼

ご回答、ありがとうございました。いただいた回答を適用したら上手く行きました。また、EXISTS関数も勉強になりました。ありがとうございました。

投稿日時 - 2011-08-15 17:09:13

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

SELECT DATA FROM T WHERE KEY >= 003-1 AND KEY <= 003+1;

ではだめですか?

投稿日時 - 2011-08-15 14:45:34

お礼

ご回答、ありがとうございました。確かに例にあげたテーブルのKEY値が、001、002…のため、ご回答のSQLでできますね。ただし、実際に適用するテーブルのKEY値は歯抜けのため、003-1の002や、003+1の004が必ず存在する訳でありませんので、003に最も近い003未満1件、003超過1件のデータを取得する方法を知りたかったので、説明不足ですみません。でも、勉強になりました。ご回答、ありがとうございました。

投稿日時 - 2011-08-15 17:06:33

あなたにオススメの質問