• 締切済み

SQL 繰り返し処理をSQLでかく方法

質問させてください。 FOR文を使うことなしに、繰り返し処理をいくつかのSELECT文にわけて処理をするにはどのようにかけば良いのでしょうか。 標準SQLです。

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

zzz処理 ccc処理 mmm処理 がどんな処理なのかによりますが、JOINや相関サブクエリを使用してカーソルループを減らせる可能性はあります。 上記の処理はストアドファンクションに変換できる可能性があります。

全文を見る
すると、全ての回答が全文表示されます。
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

ちょっと質問の内容が分かりません。 もう少し、具体的に書いてもらえませんか。

somehow123
質問者

補足

すいません。 下記のようになっております。 FOR xxx IN yyy LOOP zzz処理 (select文)・・・取得結果は複数行 FOR aaa IN bbb LOOP ccc処理 (上記処理一行ずつにselect文) ・・・取得結果は複数行 DELETE処理 FOR jjj IN kkk LOOP mmm処理 (INSERT処理) END LOOP END LOOP END LOOP これをループのネストをさせずに処理をして高速化を図りたいのですが、どのように考えればいいのか分からないのです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Selectの処理速度改善について

    先日、PL/SQLの開発について、こんな質問を受けました。 「SQLを組むさい、処理速度を速めるためにやっていることは?」 と。 で、ちょっと考えて 「Selectなら、Indexを考慮してSelect文を作成し、実行します。 処理時間がかかる場合は、実行計画などをみて、 Select文にヒント句をつけて、処理速度を改善します。」 と答えました。 答えたあと、質問者された方は、なんだかがっかりした感じでしたが、 私の回答は不適切だったのでしょうか? それとも、どういう回答が良かったのでしょうか? よろしくお願いします。

  • SQL実行時の負荷、処理時間確認

    oracle 10g Release 10.2.0.2.0を使用しています。 SQLにてDELETE文実行時のサーバ負荷、処理時間を確認したく、 次のSQLを実行しましたが、「V$SQLが無い」と怒られました。 SELECT * FROM V$SQL; oracleのバージョンを確認するSQL(select * from v$version;)は 問題なく実行できます。 V$SQLが使用できない理由、もしくは別の方法で処理負荷、処理時間を 確認できる方法とうあれば教えていただきたいです。 宜しくお願いします。

  • SQLの速度をあげるには・・・

    テキストファイルからキーワードを拾って SQLをなげています SQLの質問になってしまうかもしれません いまはADO接続でやっています Open ファイル as input...... SQL = select * from tbl where name like '%キーワード%' execute(SQL) レコードセットの値で処理をいろいろ・・・ Loop もともとのDBの件数がものすごくおおくてselect文に結構な時間が かかってしまいます。速度をあげるほうほうってあるのでしょうか 私にはおもいつかなくて・・・ こういったほうほうは どう? ってのがありましたら おしえていただきたいのですが よろしくおねがいします。

  • “SQL文を作るSQL”の書き方ってありますか?

    “SQL文を作るSQL”の書き方ってあるのでしょうか? 例えばなのですが、表同士を大量に結合して条件に当てはまったものをアップデートするようなSQLを書く場合、文法を間違うとエライこちゃ!になる場合がありますよね。 そういう場合って結合するんじゃなくて結合したSELECT文を使って条件だしをして1件1件単純アップデートをした方が安心ですよね。 (定期処理であれば効率が悪いですが・・・だったらプロシージャですか・・・というところになりますがごくたまにや1回きりのデータ変更など) そういったことをやるほうほうはありますでしょうか? 仕様はSQL99です。

  • SQLを試す方法

    自宅にいてサーバーを持っていなくてもSQL文を試したりできるサイトとかってないでしょうか? 試せるのは基本的な select 等だけで構いません。 ポスグレやオラクルなど種類はありますが 試せるのでしたらどれでも構いません。

  • SQLの高速化の方法について

    自分ではすぐに浮かばないのですが、結構急ぎのことなのでお時間がある方でご存知の方がいらしたら教えて下さると嬉しいです。なので、途中で解決していたり質問を途中で消しているかもしれませんがよろしくお願いします。 SQLで自分が書いた文を高速化したいのですが、一般的にこうすると遅いからこうする方が良いというのがあれば教えてください。 一応自分でも調べててWHERE句では結合よりも先に条件を記載する方が良いとか書いてました。 あと、IN演算子がちょっと問題な演算子ということが。 確かにSQL文を書いているソースではいくつかSELECT文があって、それぞれでIN演算子を使っています。 調べてるとIN演算子をEXISTS演算子に書き換える方が良くなるとあったのですがEXISTS演算子はカッコ内で再度SELECT文を作るんですよね? 今使っているIN演算子では、ほぼカッコ内に数字のいくつかの候補があってそこから該当する数字を選ばれるという形の方。 WHERE AAA IN ('122','244','366') といった形です。 あるSELECT文でIN演算子を使って絞った値データを次のSELECT分のIN演算子の値候補として使用しています。 つまり、上記のような文122と244のデータが見つかってSELECTされると次のSELECT文のIN演算子の候補として122と244が入るという形です。 ちなみにこの処理のメインとなるテーブルでは一つの項目の値を木構造で分けているのでその辺りも考えないといけません。 以前、こちらのサイトで教えて貰った方法で動いている GROUP BY AA.A1 HAVING COUNT(*) >= 0 といった処理も重くしてしまうのでしょうか?

    • ベストアンサー
    • MySQL
  • 動的SQLの処理件数

    PL/SQL中でSQL文を文字列に入れて、動的SQLを実行するんですが、その後にSQL%ROWCOUNTで処理件数ってとることってできますか? 自分のソースが問題なのか、動的SQLに原因があるのか悩んでいます。環境はOracle8iです。

  • T-SQLでDECODEの様な処理

    質問させて頂きます。 T-SQLでPL/SQLのDECODE()の様な処理を行いたいのですが、T-SQLでは同じ様な処理ができる関数はあるのでしょうか? やりたい処理としては、下記のINSERT文でAテーブル.項目Bに設定する値をCテーブル.項目Bの値が"1"ならBテーブル.項目Bを設定し、 それ以外ならCテーブルの.項目Bを設定するという内容です。 ※INSERT文はT-SQLで行いたい処理をPL/SQLで組んだものです。 INSERT Aテーブル ( 項目A, 項目B ) SELECT Bテーブル.項目A, DECODE(Cテーブル.項目B,'1',Bテーブル.項目B,Cテーブル.項目B) FROM Bテーブル, Cテーブル WHERE 割愛 使用しているバージョンはsqlserver2000を使用しています。 DECODE自体は使用できないことは確認済みです。実現可能か不可能や実現可能な場合はサンプルなどで教えて頂きたいです。 皆様のご助力をお願い致します。

  • SQL '%@'とは?

    こんばんわ。 SQLの質問なのですが、 SELECT * FROM aテーブル WHERE aテーブル.番号 IN '%@' というSQL文が 学校で使われていましたが、 '%@'とは何を指すのでしょうか? 調べても分からなかったので ご教授願います。

  • 【PL/SQL】SQL文が長すぎてSELECTできない

    oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1      || sqlStr2      || sqlStr3 <<省略>> )