2013-02-21 2 views
0
SELECT orderid 
FROM (SELECT orderid, rownum r 
     FROM (SELECT orderid 
       FROM myorders 
       WHERE ordertype = 'E' 
        AND orderstatus = 'A') a 
     WHERE rownum < 86) 
WHERE r > 84 

Что такое лучший способ переписать вышеприведенное утверждение SQL более понятным способом ...ORACLE оператор SQL переписать

Я попытался следующие, но я не получаю никаких результатов.

select orderid 
    from myorders 
where rownum between 84 and 86 
+5

Нет смысла брать строки с 84 по 86, если вы не применяете какие-либо на столе .... чего вы пытаетесь достичь здесь? – haki

+0

Что делать с порядковым номером и orderstatus в вашем втором решении? –

+0

Я даже не вижу, как ваш первый запрос будет скомпилирован, потому что вы выбираете rownum из подзапроса, который его не содержит. –

ответ

2

Отступ является первым предложением. Но вы можете устранить один набор подзапросов:

select orderid 
from (SELECT orderid, rownum r 
     FROM myorders 
     WHERE ordertype = 'E' AND orderstatus = 'A' 
     ) a 
where r = 85 
3

Если предположить, что вы пытаетесь генерировать страницы данных и предполагая, что ваше желание, что результаты стабильны и соответствуют ли данные в таблице не меняется (каждая строка из внутреннего запроса возвращается только на одной странице результатов при изменении верхней и нижней границ), наиболее эффективный подход будет по существу тем, что вы опубликовали на начальном этапе. Но вам нужно добавить ORDER BY во внутренний запрос. В противном случае, было бы совершенно правильным для Oracle вернуть одну строку данных на каждой странице или никогда не возвращать строку на любой странице

SELECT orderid 
FROM (SELECT orderid, rownum r 
     FROM (SELECT orderid 
       FROM myorders 
       WHERE ordertype = 'E' 
        AND orderstatus = 'A' 
       ORDER BY <<something>>) a 
     WHERE rownum < 86) 
WHERE r > 84 

Если вы действительно больше озабочены читаемости, чем производительность, вы можете уменьшить, что, один уровень вложенности, делая что-то вроде

SELECT orderid 
    FROM (SELECT orderid, 
       rank() over (order by <<something>>) rnk 
      FROM myorders 
     WHERE ordertype = 'E' 
      AND orderstatus = 'A') 
WHERE rnk > 84 
    AND rnk < 86 

в Oracle 12c, Oracle, как ожидается, для поддержки ANSI FETCH и OFFSET ключевых слов, чтобы упростить синтаксис немного дальше.

0

Если вы имеете дело с одной таблицей.

SELECT orderid 
FROM myorders 
WHERE ordertype = 'E' 
AND orderstatus = 'A' 
AND rownum between 84 and 86 
+0

Это никогда не вернет никаких значений из-за того, как генерируется псевдо-столбец 'rownum'. Это объясняется [в ответе на старый вопрос] (http://stackoverflow.com/a/855446/266304). –

+0

@ JParadiso - Я согласен с Алексом Пулом - это никогда не вернет ничего из-за природы ROWNUM. Вы должны проверить свои примеры. Вот тест: SELECT empno FROM scott.emp WHERE rownum от 5 до 10 – Art

0

Кроме того, общий пример выбора между строками. По моему личному мнению, лучше и разумнее использовать ROW_NUMBER(), а не ROWNUM. Они являются специалистами. разные ...:

-- Between rows -- 
SELECT * FROM 
    (SELECT deptno, ename, sal 
      , ROW_NUMBER() OVER (ORDER BY ename) row_seq 
    FROM scott.emp) 
WHERE row_seq BETWEEN 5 and 10 
/
Смежные вопросы