如果一个数据库查询语句返回结果很多,是否可以分批返回?

时间:2022-12-11 08:43:21
如果一个数据库查询语句返回结果很多,是否可以分批返回?

比如说要返回:1万条记录.
可否第一次返回1-100,第一次返回101-200,一次类推....直到返回所有数据.


谢谢!

15 个解决方案

#1


类如: "Select * from Users".

#2


select top 100 * from table where id > ???

#3


希望这个查询要高效.

比如:
for(int i = 0; i < 1000 ; i++){
    do_query();
}

1000次连续查询不断.(不是象某些论坛的翻页那样---感觉那样效率太低)

不知能否做到,在数据库中设置标识. 比如查完前100条记录后,第二次查询自动从101条开始查?
或者有没有更好的办法?


之所以要"一个数据库查询语句返回结果很多,是否可以分批返回", 就是象更好第控制查询过程.
随时可以中断查询查询.否则等待时间太长,还不能中断

希望得到更好的解决方法.

谢谢大家.

#4


>> select top 100 * from table where id > ???

// 如果这样作是否效率太低.
for(int i = 0; i < 1000 ; i++){
   select top 100 * from table where id > ???
}

每次从头查起??

#5


//我希望程序伪代码如下:
for(int i = 0; i < 1000 ; i++){
     move_to_point(i*100);        // 移动数据库中表的当前位置
     get_recorder_from_cur_point(100);    // 获取从当前位置开始的100条数据数据
}

不知可否实现?

#6


可以

#7


>>可以

如何作呢?请指点

#8


象ADO,对RecordSet,有Move(),可以移动数据集指针,然后取100条记录就可以了。

#9


看这里:

CString strQry;
strQry = "SELECT * FROM Recs"; 

CADORecordset pRs;
pRs = CADORecordset(&m_pDb);
if(!pRs.Open((LPCTSTR)strQry)) return false;     // 关键是这里运行时间太长

while(!pRs.IsEof())
{
    //
    pRs.GetFieldValue(...);
   
    .....

    pRs.MoveNext();
}

// 关键是这里运行时间太长
if(!pRs.Open((LPCTSTR)strQry)) return false;     

你的意思是使用Move(),但那在这条语句之后啊!

现在,这条查询语句是瓶颈!

我的意思是:如何让其100条为单位进行查询,然后不断推经数据指针。
这样可以更好地控制查询过程。随时可以中断查询。

#10


if(!pRs.Open((LPCTSTR)strQry)) return false; //你的数据库相当大?
//
那还是用Select top
或者,一次查询,多次使用(实时性不好)

#11


或者建立一个存储过程

#12


CADORecordset pRs;
pRs = CADORecordset(&m_pDb);
if(!pRs.Open((LPCTSTR)strQry)) return false; // 有没有可能先返回前100条记录!!!

// 然后通过循环逐条得到其他记录
while(!pRs.IsEof())
{
//
pRs.GetFieldValue(...);

.....

pRs.MoveNext();
}

#13


和我想提问的问题一模一样,期待高手指点!
帮顶!

#14


使用cursor或者move都会很慢
如果不对表结构进行技术处理,还是top更好

要想分页查询速度最快,可以考虑建一个关联的链表b(table)
这样就可以使用select a.* from a,b where a.id=b.id and b.num between n1 and n2

#15


似乎只能用Top

#1


类如: "Select * from Users".

#2


select top 100 * from table where id > ???

#3


希望这个查询要高效.

比如:
for(int i = 0; i < 1000 ; i++){
    do_query();
}

1000次连续查询不断.(不是象某些论坛的翻页那样---感觉那样效率太低)

不知能否做到,在数据库中设置标识. 比如查完前100条记录后,第二次查询自动从101条开始查?
或者有没有更好的办法?


之所以要"一个数据库查询语句返回结果很多,是否可以分批返回", 就是象更好第控制查询过程.
随时可以中断查询查询.否则等待时间太长,还不能中断

希望得到更好的解决方法.

谢谢大家.

#4


>> select top 100 * from table where id > ???

// 如果这样作是否效率太低.
for(int i = 0; i < 1000 ; i++){
   select top 100 * from table where id > ???
}

每次从头查起??

#5


//我希望程序伪代码如下:
for(int i = 0; i < 1000 ; i++){
     move_to_point(i*100);        // 移动数据库中表的当前位置
     get_recorder_from_cur_point(100);    // 获取从当前位置开始的100条数据数据
}

不知可否实现?

#6


可以

#7


>>可以

如何作呢?请指点

#8


象ADO,对RecordSet,有Move(),可以移动数据集指针,然后取100条记录就可以了。

#9


看这里:

CString strQry;
strQry = "SELECT * FROM Recs"; 

CADORecordset pRs;
pRs = CADORecordset(&m_pDb);
if(!pRs.Open((LPCTSTR)strQry)) return false;     // 关键是这里运行时间太长

while(!pRs.IsEof())
{
    //
    pRs.GetFieldValue(...);
   
    .....

    pRs.MoveNext();
}

// 关键是这里运行时间太长
if(!pRs.Open((LPCTSTR)strQry)) return false;     

你的意思是使用Move(),但那在这条语句之后啊!

现在,这条查询语句是瓶颈!

我的意思是:如何让其100条为单位进行查询,然后不断推经数据指针。
这样可以更好地控制查询过程。随时可以中断查询。

#10


if(!pRs.Open((LPCTSTR)strQry)) return false; //你的数据库相当大?
//
那还是用Select top
或者,一次查询,多次使用(实时性不好)

#11


或者建立一个存储过程

#12


CADORecordset pRs;
pRs = CADORecordset(&m_pDb);
if(!pRs.Open((LPCTSTR)strQry)) return false; // 有没有可能先返回前100条记录!!!

// 然后通过循环逐条得到其他记录
while(!pRs.IsEof())
{
//
pRs.GetFieldValue(...);

.....

pRs.MoveNext();
}

#13


和我想提问的问题一模一样,期待高手指点!
帮顶!

#14


使用cursor或者move都会很慢
如果不对表结构进行技术处理,还是top更好

要想分页查询速度最快,可以考虑建一个关联的链表b(table)
这样就可以使用select a.* from a,b where a.id=b.id and b.num between n1 and n2

#15


似乎只能用Top