ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?
スポンサーサイト(詳細
  • Java個別指導IT-Lab. - 誰でも最初は未経験。個別指導でプロへの道が開けます。随時入校可能

質問

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
この回答へのお礼この回答にお礼をつける(質問者のみ)
スポンサーサイト(詳細
  • Java個別指導IT-Lab. - 誰でも最初は未経験。個別指導でプロへの道が開けます。随時入校可能