2012-01-18 28 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