2012-07-11 46 views
2

如何使用查询查询选择特定范围的行?从查询查询中选择行范围

<cfquery name="myQuery" maxrows ="20" startrow="12"> 
SELECT * 
FROM previous_query 
WHERE row_numer >= 12 
</cfquery> 

之类的事情......

+0

难道你不能只是做'选择TOP 20'吗? – 2012-07-11 15:38:37

+1

查询的coldfusions不支持TOP,加上如果我想能够从记录集的任何部分检索20行。 – Dpolehonski 2012-07-11 15:42:00

回答

5

这是一个棘手的问题,但你的问题使我感兴趣。我认为我可能有一个解决方案

我写了一个函数,删除所有行之前的所有内容,然后删除所需行后面的所有内容。

函数rowrange()需要3个参数。 1.您正在使用的查询名称。 2.你想要的起始行 3.你想要的行数。

更新:我的朋友John Whish指出我实际上不需要做循环来实现这个工作。去除循环使得这个更具可扩展性。

<cfquery name="myQuery"> 
SELECT * 
FROM previous_query 
WHERE row_numer >= 12 
</cfquery> 


<cfset rowRange(myQuery,7,4)> 
<cfdump var="#myQuery#"> 

<cffunction name="rowRange" hint="return a range of rows from a given query"> 
    <cfargument name="qObj" type="query" required="true"> 
    <cfargument name="start" type="numeric" required="true" default="1" hint="The number of the first row to include"> 
    <cfargument name="range" type="numeric" required="true" default="1" hint="The number of rows"> 


    <cfset var i = arguments.start+arguments.range-1> 
    <cfset arguments.qObj.removeRows(i,arguments.qObj.recordcount-i)> 
    <cfset arguments.qObj.removeRows(0,arguments.start-1)> 

    <cfreturn arguments.qObj> 
</cffunction> 
+0

它是一个非常好的解决方案,我将能够实现在多个地点。谢谢 – Dpolehonski 2012-07-12 09:22:32

+0

更新了代码:我的朋友John Whish指出我实际上不需要做循环来实现这个工作。去除循环使得这个更具可扩展性。 – 2012-07-12 20:33:55

+0

今年,我遇到了John CF.objective()。他告诉我,我应该将客户端迁移到SQL服务器上。我希望我可以,我会将这个函数添加到我的ms Access的hacks库中。谢谢。 – Dpolehonski 2012-07-13 08:57:44

0

在CF本身这样做是不支持的,所以你必须在你的设置做原始记录中添加一列为你计数。

SELECT ..., row_num AS Counter 

Row_Num可能因您的DBMS而异。

+0

我会这样做,但Access女士不支持任何row_num类型的功能。我通过使用queryAddColumn并在执行QoQ之前手动添加一个rownumber列来模拟它。 – Dpolehonski 2012-07-12 09:24:14

+0

那么这不是真的,你可以很容易地操纵查询http://www.cwithb.com/2010/09/simplified-take-on-an-access-database-query-sql-row_numberranking-equivalent/ – Busches 2012-07-13 19:47:42

+0

这可能是正确的,但正如我发现与我的测试运行子访问数据库大数据集的查询变得指数无效..它更快地做到这一点手动在CF – Dpolehonski 2012-07-16 07:53:08