2012-01-18 29 views
0

假设我有一个表abc,列p_id,u_idcomments。我只想在某个特定的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; 

回答

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列。

您试图解决的业务问题是什么?要求您知道在获取所有行之前将获取多少行?这不是通常需要的,所以也许有更好的方法来解决你面临的任何问题。

+0

我的业务需求是,我需要从表中取记录,如果该表记录数超过一个,我需要打印所有为什么我试图避免光标获取record.Thats和在最后找到行数......并且这个光标在一个脚本中为n个公司运行,因为这是一次性脚本,这就是为什么我不担心它的性能 – 2012-01-18 18:17:54

+0

您的分析功能给出了正确的结果,Can我们使用ROW_NUMBER()和ROW_NUMBER()desc命令,因此从第一个记录中我可以知道有多少记录 – 2012-01-18 18:22:58

+0

@ user1138658 - 如果查询只返回1行,会发生什么?你什么都不做?如果查询返回0行会发生什么? – 2012-01-18 18:23:21

1

试试这个。 它使第一列为计数, 因此执行它,获取第一行。 第1列将有你需要的数字。

WITH 
BASE AS 
(
    SELECT SOME_STUFF 
    FROM SOME_TABLE 
    WHERE SOME_CONDITION 
) 
SELECT (SELECT COUNT(*) FROM BASE), 
     BASE.* 
FROM BASE