限制查询提取的记录数

时间:2010-09-14 15:42:02

标签: c# .net oracle9i recordset

我有一张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#app。我使用ODP .NET建立连接。

还有其他方法可以执行此过程吗?

2 个答案:

答案 0 :(得分:2)

Tom Kyte已经提供了限制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

我同意Scott Anderson的观点,在这种情况下,只需获取所有记录并使用几个循环。

答案 1 :(得分:1)

首先,您的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

<强>更新

我同意Scott Anderson,为什么不立即获取所有记录并将记录分成前端系统中的100个组?