Выборка данных, только если в результате есть несколько строк - PullRequest
0 голосов
/ 18 января 2012

Предположим, у меня есть таблица abc со столбцами p_id, u_id и comments. Я хочу получить данные из этой таблицы только в том случае, если для определенного значения 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 ]

2 голосов
/ 18 января 2012

Вы можете добавить аналитику 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 голос
/ 18 января 2012

Попробуй это. Это делает первый столбец счетчиком, так что выполняй, получи первый ряд. В столбце 1 будет указан нужный номер.

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