0

abcp_idu_id、およびを含むテーブルがあるとしますcomments。特定の値に対して複数の行がある場合にのみ、このテーブルからデータをフェッチしたい(テーブルには、無視したいp_idすべての「ジャンク」データの行が1 つある)。カーソルからデータをフェッチせずp_idに a に複数の行があるかどうかを判断できるように、クエリを構造化するにはどうすればよいですか。p_id

現在、私のコードは次のようになっています

Declare
  Cursor pqr is 
  Select p_id,u_id,comments from abc where p_id=123;
Begin

--I want to ignore the results if this query returns 0 or 1 row.
--I only want to process the data if this query returns multiple rows

End;
4

2 に答える 2

2

クエリにアナリティクスCOUNTを追加して、カーソルからフェッチする各行で結果セット内の行数を利用できるようにすることができます。

Declare
  Cursor pqr is 
   select p_id,u_id,comments
     from (Select p_id,u_id,comments,count(*) over () cnt
             from abc 
            where p_id=123)
    where cnt > 1;
Begin

ただし、パフォーマンスがあったとしても、おそらくそれほど多くはありません。コードを遅くする可能性がある行数をカウントするために、Oracle に結果セット全体を具体化するように強制しています。また、結果セットのすべての行に別の列を追加しているため、メモリ使用量が増加します。また、列にアクセスするには、最初の行をフェッチする必要がありCNTます。

すべての行をフェッチする前に、フェッチされる行数を知る必要がある、解決しようとしているビジネス上の問題は何ですか? これは一般的に必要とされるものではないため、直面している問題を解決するためのより良い方法があるかもしれません。

于 2012-01-18T18:13:19.177 に答える
1

これを試して。最初の列をカウントにするので、実行して最初の行をフェッチします。列 1 には必要な数が入ります。

WITH 
BASE AS
(
    SELECT SOME_STUFF
    FROM SOME_TABLE
    WHERE SOME_CONDITION
)
SELECT (SELECT COUNT(*) FROM BASE),
       BASE.*
FROM BASE
于 2012-01-18T18:33:08.277 に答える