2016-09-16 2 views
1

У меня есть запрос, который работает, однако я хочу хранить только первые две строки в переменных. Это в цикле, так что где J исходит от, но это только соответствующая частьSQL, как получить только два верхних значения

SELECT MNO, COUNT(MNO) AS NUM_ALBUMS 
FROM PERFORM 
WHERE PERFORM.SNO IN (
    SELECT DISTINCT S.ANO 
    FROM SONG S 
    WHERE S.SNO IN (
     SELECT DISTINCT P.SNO 
     FROM PERFORM P 
     WHERE j IN P.MNO 
     GROUP BY P.SNO 
    ) 
) 
AND PERFORM.MNO != 1 
GROUP BY MNO 
ORDER BY COUNT(MNO) DESC; 

Это возвращает что-то похожее на этот

 MNO NUM_ALBUMS 
---------- ---------- 
    2  3 
    3  3 
    4  2 

Я хотел бы хранить два верхних MNOs вместе с два верхних числа относятся к переменным для возврата в оператор печати. Может ли кто-нибудь помочь? Я могу редактировать с дополнительной информацией, если это необходимо.

+0

Итак, являются ли MNO 2 и 3 верхними двумя, или 2 и 3 верхнее число и 4 второе? Что делать, если у вас есть больше двух с одним и тем же счетом? – DCookie

+0

2 и 3 являются двумя верхними, неважно, совпадают ли подсчеты. Я просто хочу сохранить две верхние строки из этого запроса в переменные. –

+0

Какую версию Oracle вы используете? –

ответ

1

Вы можете ограничить результаты, возвращаемые вашего SQL-запрос с использованием FETCH ... ТОЛЬКО пункта

условием ограничения принимает в 2 величинах: смещение, а затем количества строк требуется.

Пример: Если вы хотите, строки 10-20, ваш предел пункт будет

OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY 

Чтобы вернуть первые 2 только строки, ваш запрос должен быть затем

SELECT MNO, COUNT(MNO) AS NUM_ALBUMS 
FROM PERFORM 
WHERE PERFORM.SNO IN (
    SELECT DISTINCT S.ANO 
    FROM SONG S 
    WHERE S.SNO IN (
     SELECT DISTINCT P.SNO 
     FROM PERFORM P 
     WHERE j IN P.MNO 
     GROUP BY P.SNO 
    ) 
) 
AND PERFORM.MNO != 1 
GROUP BY MNO 
ORDER BY COUNT(MNO) DESC 
OFFSET 0 ROWS FETCH NEXT 2 ROWS ONLY 

Читайте здесь: https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1

+2

'LIMIT 0,2' недействителен в Oracle –

+0

@a_horse_with_no_name спасибо за это! Исправлен ответ на диалект Oracle. Я думал о MySQL –

0

Другое возможное решение:

SELECT mno, num_albums 
    FROM (SELECT MNO, COUNT(MNO) AS NUM_ALBUMS 
      , ROW_NUMBER() OVER (ORDER BY COUNT(MNO) DESC) rn 
      FROM PERFORM 
     WHERE PERFORM.SNO IN (
       SELECT DISTINCT S.ANO 
       FROM SONG S 
       WHERE S.SNO IN (
         SELECT DISTINCT P.SNO 
         FROM PERFORM P 
         WHERE j IN P.MNO 
       GROUP BY P.SNO) 
      AND PERFORM.MNO != 1 
     GROUP BY MNO) 
WHERE rn < 3;