我想将一组查询合并到一个查询中
我试过这个
<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].
答案 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,你就不需要自己计算一个计数器,因为你可以这样做index
和item
,就像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>
内设置变量,但至少它只是一个查询