Ограничить количество записей, извлекаемых по запросу - PullRequest
1 голос
/ 14 сентября 2010

У меня есть таблица с 100 K записей. Я пишу файл XML на основе этого набора записей. Мне нужно написать 100 записей в файл одновременно. Поэтому у меня будет 1000 отдельных файлов.

В настоящее время для ограничения количества записей, записываемых в файл, я использую

SELECT * FROM TABLE WHERE ROWNUM  < 100;

Получает 100 записей и записывает их в файл. Когда я сделаю это снова, он получит те же 100 записей еще раз. Есть ли способ удалить записи, которые он уже написал?

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

SELECT * FROM TABLE WHERE ROWNUM < 100 AND PRIMARYKEY NOT IN (SELECT PRIMARYKEY FROM ANOTHERTABLE);

Я использую Oracle 9i и консольное приложение на c #. Я использую ODP .NET, чтобы установить соединение.

Есть ли другой способ сделать этот процесс?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

Общее решение по ограничению записей, извлекаемых Oracle, было дано Томом Кайтом.

select * 
  from ( select a.*, rownum rnum
           from ( YOUR_QUERY_GOES_HERE -- including the order by ) a
          where rownum <= MAX_ROWS )
 where rnum >= MIN_ROWS

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:127412348064

Я также согласен со Скоттом Андерсоном, что в этом случае просто извлеките все записи и используйте пару циклов.

1 голос
/ 14 сентября 2010

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

То, что вы можете сделать, это иметь динамический запрос (если вы нене хотите хранимую процедуру, чем просто построить строку и подсчитать :start и :end с фактическими числовыми значениями до выполнения запроса), которая ограничивает rownum, может быть что-то вроде:

select *
from(
    select table.*, rownum rn
    from table
    where rownum rownum < :end
    order by ID) s
where s.rn >= :start

ОБНОВЛЕНИЕ

Я согласен со Скоттом Андерсоном, почему бы просто не получить все записи сразу и разделить записи на группы по 100 в вашей интерфейсной системе?

...