• ベストアンサー

ループの仕方

select文で、まずデータが何件あるかカウントしたあと、 そのカウントした数の分だけ、ループしたいです。 ループに入れ込みたいSQLは以下のような感じです。 1.select 1a,1b from TABLE1 where 条件; 2.select 2a,2b from TABLE2 where 条件; カウントした数の受け渡しとかも、分からないような状態なのですが、 初心者向けに教えていただけないでしょうか。 宜しくお願いします。

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

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

  • ベストアンサー
  • yoko3333
  • ベストアンサー率35% (47/134)
回答No.2

お返事が遅くなって申し訳ございませんでした。 ちょっと仕事でバタバタしてたもので・・・。 で、回答なのですが・・・Update文ならわかるのですが、SELECT文はわかりません(>_<) ごめんなさい~。 とりあえず、Update文の場合です。(Ora8.1.7にて確認。) -------------------------------------------------- DECLARE wCount NUMBER(3); wLoop NUMBER(3); CURSOR CSR1 IS SELECT Count(*) As 件数 FROM テーブル名1; BEGIN OPEN CSR1; FETCH CSR1 INTO wCount; CLOSE CSR1; FOR wLoop IN 1..wCount LOOP UPDATE テーブル名2 SET フィールド名=値; END LOOP; COMMIT; END; / -------------------------------------------------- 単純にUpdate文のところをSelectにしてみると、エラーになっちゃうんですよね・・・。 うーん・・・。

moritaka6280
質問者

補足

もしかしたら、"DECLARE~bigin~end"、この文を打つ権限が無いかもしれないです~。 (今、上の人に確認してもらってます) 文だけ読むと、 内容的には、こんな感じの事がしたい!って感じです。

その他の回答 (2)

  • yoko3333
  • ベストアンサー率35% (47/134)
回答No.3

たびたびすみません。 ちょっと思いつきました。 ------------------------------------------------------------------- set echo off set sqlprompt "--[SPOOLING...]> " set heading off set feed off set timing off set pages 0 spool temp.sql SELECT 'SELECT 1a,1b,1c FROM TABLE1 WHERE 1a ='||count(TblB.TABLEのキー)||';' ||chr(10)|| 'SELECT 2a,2b,2c FROM TABLE2 WHERE 2a='||count(TblB.TABLEのキー)||';' FROM TABLE TblA, TABLE TblB WHERE TblA.TABLEのキー>=TblB.TABLEのキー GROUP BY TblA.TABLEのキー; spool off set heading on set feed on set timing on set pages 1000 SET SQLPROMPT "SQL> " set echo on @temp ------------------------------------------------------------------- spoolファイルを使ってみました。 一度、「temp.sql」というファイルにSQL文を書き出して、「@temp」でそのSQL文を実行しています。 SQL文を見て見たければ、「temp.sql」を自分でわかりやすいファイル名に変更して spool c:\test.sql (省略) @c:\test.sql とやってみてください。 連番を取得するのために、SQL文が複雑になってます。 単純に SELECT 'SELECT 1a,1b,1c FROM TABLE1 WHERE 1a ='||rownum||';' ||chr(10)|| 'SELECT 2a,2b,2c FROM TABLE2 WHERE 2a='||rownum||';' FROM TABLE; でもOKなような気もしますが・・・rownumがどんな場合でもきちんと1から連番になってくれる のかはっきりしなかったので、今回は見送りました。 不明な点がありましたら書きこんでください。 (またお返事が遅くなるかもしれませんが・・・。)

moritaka6280
質問者

お礼

いろいろ検討してくださって、ありがとうございました。 もう少し、自分でも調べてみたいとおもいます。

  • yoko3333
  • ベストアンサー率35% (47/134)
回答No.1

補足をお願いします。 Oracleのバージョンはなんですか? プログラムはどこに書いて、実行するのには何のツールを使いますか? (SQLPlus?ストアドプロシージャ?トリガー?VB?Access?) 具体的に決まっていないのであれば、どういう状況で、どうしてその 処理を実行したいのか、また何度も繰り返し行うのか・・・等の詳細を 教えてください。 > ループに入れ込みたいSQLは以下のような感じです。 > 1.select 1a,1b from TABLE1 where 条件; > 2.select 2a,2b from TABLE2 where 条件; ということは、データの件数分SELECT文を発行する = 条件にあう データを表示するだけ ですか??更新等ではなく? また、この意味は、1件目で「select 1a,1b from・・・」、2件目では 「select 2a,2b from・・・」、3件目「select 3a,3b from・・・」 ということでしょうか?

moritaka6280
質問者

お礼

やりたい事のイメージとして、 select count(*) from TABLE; COUNT(*) ----------  5 ↓ このカウントされた5を元に、 1から5までをループを回す select 1a,1b,1c from TABLE1 where 1a = 1~5; select 2a,2b,2c from TABLE2 where 2a = 1~5; しかし、 上のselect文を1~5までループして後に、 下のselect文がスタートするのではなく。(図1) (図1) 1a | 1b | 1c   ←上のセレクト文 --------------- 1 1a | 1b | 1c --------------- 2 ・ ・ ・ 2a | 2b | 2c   ←下のセレクト文 --------------- 1 2a | 2b | 2c --------------- 2 ・ ・ ・ 上のselect文の1が発行されたら、下も1を発行し、 つづいて2,3,…という風に交互に表示したいのです。(図2) (図2) 1a | 1b | 1c   ←上のセレクト文 --------------- 1 2a | 2b | 2c   ←下のセレクト文 --------------- 1 1a | 1b | 1c   ←上 --------------- 2 2a | 2b | 2c   ←下 --------------- 2 ・ ・ ・ webなどを探しても、同じ例が見つけられなかったので、 宜しくお願いします。

moritaka6280
質問者

補足

補足します。 oracle10gで、SqlPlusを使っています。 やりたいことはselect文発行のみです。(それ以上の権限が無いもので...) カウントされたデータの数が9であれば、 1.と2.の両方とも9回ループしたいという意味です。 言葉不足のヤヤコシイ表現になっていまい、すみません。_(._.)_ また説明不足な点がありましたら、補足させていただきます。 よろしくおねがいします。

関連するQ&A

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • 複数テーブルでの件数検索について

    Oracle上の2つのテーブルからの条件でマッチする件数をSQLで作成しています。 内容としては、テーブルAの区分=1 かつ テーブルBの種別がスペースの件数です。 テーブルAの該当するデータは10件中3件、テーブルBの該当するデータは50件中15件で、本来両方がマッチするのは2件です。 SELECT COUNT(*) FROM テーブルA,テーブルB WHERE テーブルA.区分 = '1' AND テーブルB.種別 = ' ' ; 上記のSQL文で件数をカウントしたのですが、どうも結果では30件とカウントされてしまいます。 なんとか2件として結果を出したく、参考資料を調べているところなのですが、今のところ参考になる文献が見つからず悩んでます。もし簡単にカウントできるSQLがあったり、分かる方がいれば手助けして頂きたいと思い、今回投稿しますのでご教授賜りたく思います。よろしくお願いします。

  • まったく別のテーブルの結果MYSQL

    table_1 id name age table_2 id book title city day SELECT * FROM table_1 WHERE id=? SELECT book,title FROM table_2 WHERE city=? このようにまったく別のテーブル カラム数も違う WHEREの?も違う これを一つのSQL文にまとめたいのですが。 UNIONなどを使ってもうまくいきませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • WHERE文の中で除算

    SQLのWHERE文の中で計算をしているのですが、「除数が0です」とのエラーがでてしまいます。 同じ計算をSELECT文の中にいれると、エラーにならず、計算結果がでるのですが、どうしてでしょうか? SELECT DATA, (A + B - C) / (A + B) * 100 FROM table ↑この時は計算結果がでます。 SELECT DATA FROM table WHERE (A + B - C) / (A + B) * 100 <= 50.0 ↑「除数が0です」といわれてしまいます。

  • 実行計画HASH JOIN RIGHT OUTER

    以下のようなSQLがあるとします。 ------------------------ SELECT * from (select * from TABLE-A where 条件色々) AA, TABLE-B BB where BB.x(+) = AA.x ------------------------ TABLE-Aの件数は非常に多く(例100万)、条件は複雑です。 TABLE-Bの件数は少ないです(例30件) この時、実行計画が HASH JOIN RIGHT OUTER TABLE ACCESS FULL TABLE-B のように出ましたが、どのように解釈すれば良いのでしょう? TABLE-Bは件数が少ないのでACCESS FULLでも問題ないでしょうか? HASH JOIN RIGHT OUTER のコストが高くなってて気になってます。 たとえば、この場合のより適切な実行計画ってありますか?

  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • MySQL4で2つのテーブルを結び付ける方法

    MySQL4で2つのテーブルを結び付ける方法は 以下のどちらが正しいのでしょうか? (while文中でSQLを発行せずに、をSQL文1発で出す場合) um_ukがどちらのテーブルにも共通なモノとして、 ■1 SELECT * FROM a_table A,b_table B WHERE A.um_uk = $um_uk AND B.um_uk=$um_uk; ■2 SELECT * FROM a_table.A,b_table.B WHERE A.um_uk = $um_uk AND B.um_uk=$um_uk; また、どちらも間違っている場合正解をご教授下さい。

    • ベストアンサー
    • MySQL
  • 同一レコードを複数取り出したい

    以下のようなテーブルがあったとます。 <AA table> A B ------ 01 2 02 3 03 4 A = '01'のレコードを取り出す場合には、 select * from AA where A = '01'; A B ------ 01 2 で取れますが、このときBの値を判断して、以下のようにBの数だけ同一レコードを取り出したいと思います (where A = '01'ならば) A B ------ 01 2 01 2 (where A = '03'ならば) A B ------ 03 3 03 3 03 3 03 3 このように、同一レコードを条件によって複数取り出す処理をSQLで記述することはできるのでしょうか?

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。