質問 |
||
| QNo.4025026 | SQL xx件目からxx件目までを抽出したい | |
|---|---|---|
| 質問者:optimas |
SQLを習いはじめました。 ユーザーIDが100件あるテーブルの30件目〜50件目の ユーザIDを抽出し、別テーブルに登録をしたいと思っています。 『このxx件目からxx件目まで』の抽出のしかたがわかりません。 どなたかわかる方がいましたら教えてください。 DECLARE CURSOR cursor_name IS SELECT USER_ID FROM TBL_USERID ; getid VARCHAR2(16); ryear NUMBER := '2008'; ryear2 NUMBER := '08'; rmonth NUMBER; rday NUMBER; usercnt NUMBER; rcnt NUMBER := '0'; --処理開始 BEGIN SELECT count(USER_ID) INTO usercnt FROM TBL_USERID ; OPEN cursor_name ; LOOP FETCH cursor_name INTO getid ; EXIT WHEN cursor_name%NOTFOUND; --月でループ(1〜12月) For rmonth IN 1..12 LOOP --日でループ(1〜22日) For rday IN 1..22 LOOP --スケジュール1件目 rcnt := (rcnt + 1); INSERT INTO TBL_SCH ( SCHEDULE_ID ,USER_ID ,UPDATE_DATETIME ) VALUES ( ryear || Trim(TO_CHAR(rmonth,'00')) || Trim(TO_CHAR(rday,'00')) || Trim(TO_CHAR(rcnt,'00000000')) ,'getid' ,SYSTIMESTAMP ); END LOOP; END LOOP; END LOOP ; CLOSE cursor_name ; END ; |
|
困り度:
|
||
| 質問投稿日時: 08/05/15 21:32 |
||
回答良回答20pt |
|
| ANo.3 | 分析関数を使った例。SQL SERVER2005から、ORACLEなら8iのEE(9iからはSTANDARD EDITIONも)から使えます。 SELECT A.* FROM ( SELECT *,ROW_NUMBER() OVER( ORDER BY ソートキー項目 ) RN FROM テーブル名 ) A WHERE RN BETWEEN 30 AND 50 |
|---|---|
| 回答者:nora1962 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/16 00:38 |
|
| |
| この回答へのお礼 | 回答ありがとうございます。 テープルはこのような感じなのですが、頂いた回答からすると… +---------+-----------+ | USER_ID | USER_NAME | +---------+-----------+ | 001 | nameA | +---------+-----------+ | 021 | nameB | +---------+-----------+ | 042 | nameC | +---------+-----------+ DECLARE CURSOR cursor_name IS SELECT TBL_USERID.USER_ID FROM ( SELECT USER_ID,ROW_NUMBER() OVER( ORDER BY USER_ID ) RN FROM TBL_USERID) TBL_USERID WHERE RN BETWEEN 30 AND 50; getid VARCHAR2(16); ryear NUMBER := '2008'; ryear2 NUMBER := '08'; rmonth NUMBER; rday NUMBER; usercnt NUMBER; rcnt NUMBER := '0'; --処理開始 BEGIN SELECT count(USER_ID) INTO usercnt FROM TBL_USERID ; OPEN cursor_name ; LOOP FETCH cursor_name INTO getid ; EXIT WHEN cursor_name%NOTFOUND; ・ ・ ・ となるのでしょうか? いますぐ検証環境でテストができないので・・ |
回答 |
|
| ANo.2 | たしかにSQLServerの書き方には見えませんね(汗 MySQLならLIMITがあります。SQLServerだと SELECT TOP 20 [column] FROM [table] WHERE [column] NOT IN (SELECT TOP 30 [column] FROM [table]); などとすれば31〜50件めが取得できます(元のselectとサブのselectのorderを合わせないといけません)。 |
|---|---|
| 回答者:shimix | |
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| 回答日時: 08/05/15 23:22 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | ROWNUM擬似列や分析関数を利用すれば、もっと簡単に行えます。 |
|---|---|
| 回答者:chukenkenkou | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/15 23:08 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |