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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

Q&A

解決済

1回答

5648閲覧

【SQL】【Oracle】指定した行数ずつデータを取得する方法

momonoki

総合スコア21

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

0グッド

0クリップ

投稿2017/11/30 05:07

従業員情報を保持しているemployeeテーブルがあるとします。
カラムはemployee_id, employee_name, employee_genderです。
今、employeeテーブルに対して下記のSQLを実行しました。

SELECT
employee_id,
employee_name,
employee_gender
FROM
employee
WHERE
employee_gender <> 'female'
ORDER BY
employee_id

この取得結果から、特定の行数のレコードだけ取り出す方法がありますでしょうか。


■例
10という引数が与えられたら、上記SQLの取得結果から、
1~10行目、21~30行目、41~50行目……のように隔10行ずつ取ってきたい。
※11~20行目、31~40行目……は取ってこない

20という引数が与えられたら
1~20行目、41~60行目、81~100行目のように隔20行ずつ取ってきたい。
※21~40行目、61~80行目……は取ってこない

■備考
・1回のSQLで取得したい(上記のSQLに追記する形)
・表のMAXのレコード数は不定
・employee_idは1からの連番


なお、

employee_gender <> 'female' ⇒ この条件が付く前は以下のように取得していました。


SELECT
employee_id,
employee_name,
employee_gender
FROM
employee
WHERE
MOD(TRUNC(employee_id / 引数), 2) = 0
ORDER BY
employee_id


「employee_gender <> 'female'」の条件が付いて、employee_idが使えなくなったため、
並べ替えた結果に、ROWNUMや、ROW_NUMBERで行番号を振って、employee_idの代わりに使おうとしましたが、
ROWNUMやROW_NUMBERでは演算が行えないらしく、どうしようかと思っています。

他に使えそうな関数がある等の情報でも良いのですが、
何か知識をお持ちの方がおられましたらご教示願いたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ROWNUMの値は副問い合わせにすれば使うことができるので、こんな感じで実装できそうです。

SQL

1SELECT * FROM ( 2 SELECT ROWNUM as rn, employee_id, employee_name, employee_gender FROM ( 3 SELECT 4 employee_id, 5 employee_name, 6 employee_gender 7 FROM 8 employee 9 WHERE 10 employee_gender <> 'female' 11 ORDER BY 12 employee_id 13 ) 14) 15WHERE MOD(TRUNC((rn-1)/10),2)=0

WHERE句で10としているところを変数に変更すれば良いです。
ただレスポンス的にどうなのかはわからないです。

投稿2017/11/30 05:33

ttyp03

総合スコア16996

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

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

momonoki

2017/11/30 05:54

できました!サブクエリの中にさらにサブクエリを作るんですね。 とても助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問