2008-10-01 3 views
3

У меня сложный запрос с предложением group by и order by, и мне нужно отсортированное число строк (1 ... 2 ... (n-1) ... n), возвращаемое с каждой строкой. Использование ROWNUM (значение присваивается строке после прохождения предикатной фазы запроса, но до того, как запрос выполняет какую-либо сортировку или агрегацию) дает мне не отсортированный список (4 ... 567 ... 123 ... 45 ...). Я не могу использовать приложение для подсчета и назначения чисел для каждой строки.Oracle ROWNUM pseudocolumn

ответ

11

Есть ли причина, по которой вы не можете просто сделать

SELECT rownum, a.* 
    FROM (<<your complex query including GROUP BY and ORDER BY>>) a 
+1

Ну, по крайней мере, означает, что было бы двое из нас, делающих это так, lol! – Carl 2008-10-01 21:14:11

3

Вы можете сделать это как подзапрос, так что есть:

select q.*, rownum from (select... group by etc..) q 

Это было бы, вероятно, работать ... не знайте, есть ли что-то лучше этого.

0

Можете ли вы использовать встроенный запрос? т.е.

SELECT cols, ROWNUM 
FROM (your query) 
0

Предполагая, что вы запрос уже упорядочен в порядке, вы хотите, и вы просто хотите номер, чтобы указать, какие строки в том порядке, как это:

SELECT ROWNUM AS RowOrderNumber, Col1, Col2,Col3... 
FROM (
    [Your Original Query Here] 
) 

и заменить «Colx» с именами столбцов в вашем запросе.

0

я иногда сделать что-то вроде:

SELECT * FROM 
(SELECT X,Y FROM MY_TABLE WHERE Z=16 ORDER BY MY_DATE DESC) 
WHERE ROWNUM=1 
0

Если вы хотите использовать ROWNUM, чтобы сделать что-нибудь больше, чем ограничить общее количество строк, возвращаемых в запросе (например, И ROWNUM < 10) вы будете нуждаться к псевдониму ROWNUM:

select * 
    (select rownum rn, a.* from 
      (<sorted query>) a)) 
where rn between 500 and 1000 
Смежные вопросы