SQL xx件目からxx件目までの抽出方法とは?

このQ&Aのポイント
  • SQLを習いはじめた人が知りたい、テーブルのxx件目からxx件目までの抽出方法についての質問です。
  • ユーザーIDが100件あるテーブルから、30件目から50件目までのユーザIDを取得し、別のテーブルに登録したいと考えています。
  • 具体的な抽出方法について教えていただける方がいれば、お願いします。
回答を見る
  • ベストアンサー

SQL xx件目からxx件目までを抽出したい

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 ;

  • Oracle
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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

optimas
質問者

お礼

回答ありがとうございます。 テープルはこのような感じなのですが、頂いた回答からすると… +---------+-----------+ | 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;   ・   ・   ・ となるのでしょうか? いますぐ検証環境でテストができないので・・

その他の回答 (2)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.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を合わせないといけません)。

回答No.1

ROWNUM擬似列や分析関数を利用すれば、もっと簡単に行えます。

関連するQ&A

  • SQLのカーソルについて

    SQLのカーソルについて質問があります。 OPEN CURSOR1; LOOP OPEN CURSOLR2; LOOP ・・・・ END LOOP; CLOSE CURSOR2; END LOOP; CLOSE CURSOR1; みたいな構文は可能ですか??? また2008というNUMBER型の数字と、4というNUMBER型数字を年月と認識させるために、TO_DATE(2008*100+4,'YYYYMM')→DATE型の200804と認識できる?? ということについて教えてください。

  • SQL文でどこが悪いのか教えて下さい

    初心者ですが教えて下さい。 表Aと表Bで表Aに含まれていないものを表Cに入れたいのですが、下記のやり方では表Aのものしか入れることができません。 どこが悪いのか教えて下さい。 ・コードは複雑なため、簡略化しています。UNIONは使わない方向で。 CREATE OR REPLACE PROCEDURE SAMPLE IS CURSOR SELLINE1 IS SELECT * FROM A ORDER BY KEY1,KEY2; CURSOR SELLINE2 IS SELECT * FROM B ORDER BY KEY1,KEY2; CNT1 NUMBER; CNT2 NUMBER; BEGIN SELECT COUNT(*) INTO CNT1 FROM C; IF CNT1 = 0 THEN FOR SELREC IN SELLINE1 LOOP INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END LOOP; FOR SELREC IN SELLINE2 LOOP SELECT COUNT(*) INTO CNT2 FROM C WHERE (KEY1 = SELREC.KEY1) AND (KEY2 = SELREC.KEY2); IF CHK_CNT2 = 0 THEN INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END IF; END LOOP; END IF; END; /

  • カーソルで値取得

    あるテーブルから頭から10件分 カーソルで値を取得するようにしていましたが、 元々下記のようだったものを… CURSOR cursor_name IS SELECT TBL_A.E_ID,TBL_A.C_ID FROM (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10;     ↓ CURSOR cursor_name IS SELECT TBL_A.E_ID, TBL_M.S_ID, TBL_M.S_NAME, TBL_U.USER_ID FROM ((TBL_A INNER JOIN TBL_EU ON TBL_A.E_ID = TBL_EU.E_ID) INNER JOIN TBL_U ON TBL_EU.S_ID = TBL_U.S_ID) INNER JOIN TBL_M ON TBL_EU.S_ID = TBL_M.S_ID WHERE (((TBL_EU.DIVISION)="2")); というように取得する値をふやしたいのですが、元にあった (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10; をどこに組み込んでいいのかわらず困っております。 どなかた教えて頂けないでしょうか?お願いいたします。

  • plpgsqlのエスケープ文字について

    plpgsqlのエスケープ文字について教えてください tblのテーブルのnameフィールドの値をtitleフィールドに更新する関数を作成してます。 cur cursor for SELECT id, name FROM tbl; rec RECO RD; begin open cur; LOOP FETCH cur INTO rec; EXIT WHEM NOT FOUND; w_sql := ''UPDAT tbl SET title = ''; w_sql := w_sql ll '' ''''タイトル: '' ll rec.name ll '' '''' ''; w_sql := w_sql ll '' WHERE id= '' ll rec.id= '' ll rec.id ; EXECUTE w_sql; END LOOP; ・ ・ ・ ・ ・ 上記のようにnameフィールドの値をset句に設定していますが、 nameフィールドには 「90's」 や「men's」 のような値が入ったレコードがあるためエラーとなってしまいます。 name内の「'」をエスケープする為にはどのように書けばよいでしょうか 教えてください

  • PL/SQLの動的SQLで複数の項目を取得する方法教えて下さい。

    動的SQLで複数の項目を取得する方法で 悩んでいます。 下記の例だと、1項目しか取れません。 何か他のやり方でもいいので、複数の項目を 取得する方法を教えていただきたいです。 ********************************************* declare sql_stmt varchar2(200); wk_grp varchar2(5); wk_name varchar2(30); type cursor_type is ref cursor; cur_name cursor_type; begin wk_grp := '1u'; open cur_name for 'select 名前 from 社員表 where 所属グループ = :v1' using wk_grp; loop fetch cur_name into wk_name; exit when cur_name%notfound; dbms_output.put_line(wk_name); end loop; close cur_name; end; ********************************************* 下記のようなDBMS_SQLパッケージ?? を利用した方法がいいんでしょうかね。。。。 DBMS_SQL.COLUMN_VALUE(SQL,1,WK_NAME) DBMS_SQL.COLUMN_VALUE(SQL,2,WK_NO) よくわかってないので、宜しくお願いします。

  • PL/SQLでテーブル名に変数を使いたい

    下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL CURSOR C_CUR IS SELECT COUNT (*) FROM V_TABLE_NAME; BEGIN for ・・・・・ loop ・・・  ・・・ V_TABLE_NAME := GET_TABLE;  OPEN C_CUR;  FETCH C_CUR into w_count; CLOSE C_CUR; end loop;

  • LOOP処理について

    条件に当てはまる値を10件SELECTし、 INSERTしたいのですが試せる環境がなく確認できない状態です。 もしテーブルを全件みて該当データがない場合も処理終了と したいのですが下記のような書き方でよいのでしょうか? どなたかご助言いただけないでしょうか?お願いします。 BEGIN WHILE (10=i) LOOP SELECT A INTO AA FROM TBL_A WHERE A = "xxx" INSERT INTO TBL_B (A_ID)VALUES(AA) EXIT WHEN (10=i) ; END LOOP; DBMS_OUTPUT.PUT_LINE('呼び出されます'); END;

  • PL SQL のループ

    あるセレクト文のパフォーマンスを測定するためにループで複数回実行し時間を測定したいのですが、select 変数 into をしないとコンパイルできず実行できません。 同じセレクト文を複数回実行し時間を測定するのに良い方法は無いでしょうか? CREATE OR REPLACE PROCEDURE test IS BEGIN DBMS_OUTPUT.PUT_LINE(TO_CHAR(sysdate(),'YYYY/MM/DD HH24:MI:SS')); FOR i IN 1..100 LOOP SELECT a,b,c,d,e FROM tbl; END LOOP; DBMS_OUTPUT.PUT_LINE(TO_CHAR(sysdate(),'YYYY/MM/DD HH24:MI:SS')); END;

  • VBAのループの作成方法

    質問があります。 <ソース> With Worksheets(Sheet_No)  For x = 1 To 100   F = 0 For y = 1 To 200    Check = StrComp(Trim(Nyukan_name(x)), Trim(Userid_name(y)), vbTextCompare)    If Check = 0 Then    Outdata_ok(????) = Userid_name(y) & " | " & User_id(y) ???? = ???? + 1 F = 1 End If Next y If F <> 1 Then Outdata_ng(??) = Nyukan_name(x) ?? = ?? + 1 End If Next x End With 上記で配列のデータを配列に入れたいのですが、ループ処理がうまくいきません。(????と??の場所)Err内容:インデックスがありません。 変数の宣言も不明なのですが、Userid_name(y) と Nyukan_name(x)の値を1から順番にOutdata_ok(????) と Outdata_ng(??) に入れたいのですが、どのようにするのでしょうか? <サンプル> Nyukan_name(x) Userid_name(y) 1 1   aaaa 2 2 bbbb 3 1 cccc 4 3 dddd 上記のようにあった場合、Outdata_ok(????) にはNyukan_name(x)にある1でヒットしたものはすべて格納 Nyukan_name(x)にある4でUserid_name(y)に無いものはOutdata_ng(??)に格納

  • 【PL/SQL】CURSOR ・・・ IS SELECT・・・FOR UPDATE が機能しない

    カーソルの宣言で、FOR UPDATE を指定しているのに、 WHERE CURRENT OF での更新が効きません。 エラーは発生せず、全件分ループも回っているのですが、値がまったく書き換わっていません。 Oracle Ver. = Oracle8i Release 8.1.6.0.0 CREATE OR REPLACE FUNCTION TEST_FNC RETURN BOOLEAN IS todofu_cd NUMBER(2) := 0; strSQL VARCHAR2(2000) := ''; CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE; BEGIN For cur_rec In cur Loop DECLARE BEGIN SELECT TODOFU_CD INTO todofu_cd FROM M_POST WHERE POST_NO = cur_rec.POST_NO; EXCEPTION When NO_DATA_FOUND Then todofu_cd := 0; END; UPDATE TEST_TBL SET TODOFU_CD = todofu_cd WHERE CURRENT OF cur; COMMIT; End Loop; EXCEPTION  (省略) END; / 「CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE;」の部分は、 「CURSOR cur IS SELECT POST_NO, TODOFU_CD FROM TEST_TBL FOR UPDATE OF TODOFU_CD; 」と記述しても結果は同じでした。 上書きしようとしている値である「todofu_cd」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。 原因が分かる方がいらっしゃいましたらご教授下さい。 また、質問の内容に不備があるようでしたら、ご指摘下さい。 以上、どうかよろしくお願い致します。