将一组查询合并到一个查询中

时间:2014-02-02 22:27:03

标签: coldfusion coldfusion-9 qoq

我想将一组查询合并到一个查询中

我试过这个

<cfquery name="MergedData" dbtype="query">
    <cfloop from="1" to="#arrayLen(arData)#" index="k"> 
        SELECT *
        FROM    arData[k]
        <cfif k LT ArrayLen(arData)>UNION</cfif>
    </cfloop>
    ORDER BY EID
</cfquery>

我收到的错误似乎是

<br><b>Query Of Queries syntax error.</b><br> Encountered "[k]. 

4 个答案:

答案 0 :(得分:2)

尝试一种循环遍历数组的替代方法。您需要创建自己的计数器,以确定是否需要将“UNION”附加到SQL语句中的逻辑。

<cfset i = 1>
<cfquery name="MergedData" dbtype="query">
    <cfloop index="k" array="#arData#"> 
        SELECT *
        FROM    k
        <cfif i LT ArrayLen(arData)>UNION</cfif>
        <cfset i++>
    </cfloop>
    ORDER BY EID
</cfquery>

注意:如果你使用的是Railo而不是Adobe CF,你就不需要自己计算一个计数器,因为你可以这样做indexitem,就像Peter在以上评论:

<cfloop index="i" item="k" array="#arData#"> 

答案 1 :(得分:1)

如果您想通过函数式编程实现此目的,可以使用Underscore.cfc library(需要CF 10+或Railo 4 +):

// instantiate Underscore library
_ = new Underscore();

// convert the array of queries to a single array of structs
mergedArray = _.reduce(arrayOfQueries, function (memo, query) {
  // convert current query to an array of structs
  //   and concatenate it to the rest of the result
  return _.concat(memo, _.toArray(query));
}, []);

// convert the array of structs back to a query
mergedQuery = _.toQuery(mergedArray);

此解决方案利用reduce()将查询数组合并到单个结构数组中。传递给reduce()的匿名函数使用toArray()将查询数组中的每个查询转换为结构数组,然后将该数组与结构数组的其余部分(memo值连接起来)。

一旦将查询数组转换为单个结构数组,使用toQuery()将其转换回查询就很简单(假设这是必要的)。

注意:我写了Underscore库

答案 2 :(得分:0)

试试这样:

    <cfsavecontent variable="testing">
    <cfset j = 1>
    <cfloop array="#test#" index="i">
        SELECT id FROM #i# LIMIT 10
        <cfif j LT ArrayLen(test)> UNION </cfif>
        <cfset j++>
    </cfloop>
</cfsavecontent>

<cfquery name="qTest" datasource="#application.dsn#">
    #testing#
</cfquery>

答案 3 :(得分:0)

这就是最终的工作

<cfquery name="local.qryMergedData" dbtype="query">
    <cfloop array="#arguments.Data#" index="k">
        <cfset local.currentIndex++>
        <cfset setvariable("Data_#local.currentIndex#", k)>

        SELECT *
        FROM   Data_#local.currentIndex#
        <cfif local.currentIndex LT local.MaxIndex>UNION</cfif>
    </cfloop>
    ORDER BY EID
</cfquery>  

我真的不喜欢我在<cfquery>内设置变量,但至少它只是一个查询