Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Как из выборки убрать стобец


Автор: Artemon 13.7.2011, 12:51
Есть запрос из таблицы, который кроме прочего, возвращается также столбец rownum, в котором содержится порядковый номер строки.

Вопрос: Как это поле исключить из выборки ?

Запрос примерно такой:

Код

select * from(
                select a.*, rownum rnum from
                                            (
                                            select * from ce101 order by Id 
                                            ) a where rownum <= 2 + 2 
             ) where rnum > 2


Но в ыборке rownum мне не нужен.

Автор: Zloxa 13.7.2011, 12:53
Цитата(Artemon @  13.7.2011,  12:51 Найти цитируемый пост)
Как это поле исключить из выборки ?

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

Автор: Artemon 13.7.2011, 13:05
Проблема в том, что я заранее не знаю какие стобцы в таблице.

А этот изврат с rownum, нужен лишь для того, чтобы можно было делать выборку порциями (аналог MySql limit)

Автор: Zloxa 13.7.2011, 13:07
Просто как забава, не как решение
Код

select * 
from(select a.*
       from(
            select * from ce101 order by Id 
           ) a 
       where rownum <= 2 + 2 
       order by id desc
) 
where rownum <= 2
order by id

вроде б должно работать, если id not null

Добавлено через 2 минуты и 59 секунд
Цитата(Artemon @  13.7.2011,  13:05 Найти цитируемый пост)
Проблема в том, что я заранее не знаю какие стобцы в таблице.

Да, проблемма именно в том, что вы не знаете какие столбцы в таблице. И именно эту проблему стоит решать, а не частные, вытекающие из нее последствия  smile 

Если это нужно исключительно для клиенстких целей - что, в конце концов мешает отфильтрвать поле на клиенте?

Автор: Artemon 13.7.2011, 15:19
Цитата(Zloxa @  13.7.2011,  13:07 Найти цитируемый пост)
Да, проблемма именно в том, что вы не знаете какие столбцы в таблице. И именно эту проблему стоит решать


Это часть логики, которая нужна, но при этом порождает проблема.

Первоначальное зло - это то что хваленый Oracle не имеет аналога LIMIT

Автор: Zloxa 13.7.2011, 17:09
Цитата(Artemon @  13.7.2011,  15:19 Найти цитируемый пост)
Первоначальное зло - это то что хваленый Oracle не имеет аналога LIMIT

 smile 
Нет.. первоначальное зло, что в MySQL нет ансишного row_number и они выкрутились лимитом, стыренным, емнип у дибиту, а вы, в свою очередь недальновидно заложили свою архитектуру на использование этой фичи.

Впрочем, лимит это не самое кардинальное отличие MySQL от Оракли. )) Самое "вкусное" - не столь очевидно 

Автор: Artemon 14.7.2011, 11:05
Цитата(Zloxa @  13.7.2011,  17:09 Найти цитируемый пост)
Самое "вкусное" - не столь очевидно 

Это что например ?

Добавлено через 2 минуты и 42 секунды
Цитата(Zloxa @  13.7.2011,  17:09 Найти цитируемый пост)
 вы, в свою очередь недальновидно заложили свою архитектуру на использование этой фичи.


Попробуй тут заложи, когда MSSQL Server использует для ограничения вывода TOP, MySql LIMIT, Oracle  - RowNumber, остальные видимо еще что-то еще.
И необходимо чтобы все это поддерживалось в одном продукте. Но я конечно изголился и сделал, и даже все работает корректно, но осадок остался.






Автор: Zloxa 14.7.2011, 11:50
Цитата(Artemon @  14.7.2011,  11:05 Найти цитируемый пост)
Это что например ?

совершенно, в корне разные принципы обеспечения изоляции транзакций.
Все коварство этой разницы заключается в том, что кривизна становится заметной только под многопользовательской нагрузкой.

Цитата(Artemon @  14.7.2011,  11:05 Найти цитируемый пост)
И необходимо чтобы все это поддерживалось в одном продукте.

Я всегда говорил что адекватный технический специалист врядли станет ратовать за абстрагирование от платформы бд.

Автор: Artemon 14.7.2011, 11:54
Цитата(Zloxa @  14.7.2011,  11:50 Найти цитируемый пост)
совершенно разные принципы обеспечения изоляции транзакций.Все коварство этой разницы заключается в том, сто кривизна становится заметной только под многопользовательской нагрузкой.

Раз уж начали эту тему, не моглибы показать живой примерчик такой кривизны ?

Автор: Zloxa 14.7.2011, 12:00
Как бы классика жанра:

Код

insert into table (id) select coalesce(max(id) + 1,1) from table

при конкурентном доступе в режиме изоляции read commited на блокировочниках(MS SQL,MySQL) не будет приводить к появлению дублирущися id, на версионниках (Oracle,FB,PG) - запросто.

Автор: Artemon 14.7.2011, 12:11
спасибо за пример

Автор: Artemon 14.7.2011, 13:30
Zloxa, можешь посоветовать литературу по видам блокировок Oracle (и желательно MySql, MSSQL) ?

Автор: Zloxa 14.7.2011, 13:46
Цитата(Artemon @  14.7.2011,  13:30 Найти цитируемый пост)
посоветовать литературу по видам блокировок Oracle 

В том то и дело, что не блокировками одними обеспечиватесся согласованность в оракле.
Основное и краеугольное отличие - чтение не блокирует запись, и, что более важно, запись не блокирует чтение. Согласованность чтений достигается тем,, что ханится история изменения данных. Именно по этому этот класс серверов и называется версионниками. Именно на этой фиче и вылез оракл.

http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/consist.htm#CNCPT020

Цитата(Artemon @  14.7.2011,  13:30 Найти цитируемый пост)
и желательно MySql, MSSQL

 smile 
Тут я и сам по верхам нахватамшись.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)