sql >> データベース >  >> RDS >> Oracle

カーソル内にネストされたカーソル

    通常は、2つのテーブルを結合するだけです。

    FOR some_cursor IN (SELECT s.col1,
                               s.col2
                          FROM sometable s
                               JOIN temp_table t ON (s.col3 = t.col1))
    LOOP
      <<do something>>
    END LOOP
    

    ただし、効率が心配なので

    • TEMP_TABLEですか 本当に一時的なテーブル?もしそうなら、なぜですか? Oracleが実際に一時テーブルを使用する必要があることは非常にまれであるため、そもそも一時テーブルにデータを入力するのに非効率的なことをしているのではないかと思われます。
    • カーソルがFORなのはなぜですか TEMP_TABLEからのデータを処理するためのループ ?行ごとの処理はPL/SQLで何かを行うのに最も遅い方法であるため、効率が心配な場合は一般的に回避されます。パフォーマンスの観点から、一連の単一行のINSERTを実行するループを実行するのではなく、SQLを最大化する必要があります。 またはUPDATE 操作では、単一のINSERTを実行します またはUPDATE 行のセット全体を変更しました。データをチャンクで処理する必要がある場合は、PL / SQLコレクションと一括処理が役立ちますが、ストレートSQLほど効率的ではありません。
    • なぜDISTINCTがあるのですか TEMP_TABLEに対するクエリで ? big_idが重複することを本当に期待していますか 間違っていない値?ほとんどの場合、人々はDISTINCTを使用します データが正しく結合されていない問題をカバーするため、または将来、制約が自分自身を保護するためのより適切な方法であるときに誤ったデータが作成された場合に備えて、Oracleに高価な並べ替えを強制する場合のいずれか。
    • >


    1. その場でのPHP合計エコー結果(難しい)

    2. 幅優先探索方式での一般的なツリートラバーサル(無限)

    3. 休止状態の検索クエリ

    4. ドミノの秘密、またはドミノゲームデータモデル