假设我有一个包含列p_id
、u_id
和comments
的表abc
。只有当某个特定的p_id
值有多行时,我才想从该表中获取数据(对于我想忽略的每个p_id
,表中都有一行"垃圾"数据)。如何构建查询,以便在不从游标获取数据的情况下确定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;
您可以将分析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
列。
您试图解决的业务问题是什么,需要在提取所有行之前知道要提取多少行?这不是通常需要的,所以也许有更好的方法来解决你面临的任何问题。
试试这个。它使第一列成为计数,所以执行它,获取第一行。第1列将包含您需要的数字。
WITH
BASE AS
(
SELECT SOME_STUFF
FROM SOME_TABLE
WHERE SOME_CONDITION
)
SELECT (SELECT COUNT(*) FROM BASE),
BASE.*
FROM BASE