我如何可以使用的查询的查询联盟在n-记录集当var范围是必要的?

StackOverflow https://stackoverflow.com/questions/485212

  •  20-08-2019
  •  | 
  •  

我希望能够做到查询的查询联盟的一个未知的数量的记录集。但是在做一个查询的查询点或方括号中不允许使用的记录集名称。

例如这个失败:

<cfquery name="allRecs" dbtype="query">
    SELECT * FROM recordset[1]
    UNION
    SELECT * FROM recordset[2]
</cfquery>

使用动态的变量名称,如"recordset1"的工作,但这是在一种功能和需要变范围内的所以我不可能建立的变量名称的动态存储器而不产生泄漏,在一个持续的对象。

任何其他想法吗?

有帮助吗?

解决方案

困难的任务。我能想象基于GetColumnNames(),使用QueryAddRow()QuerySetCell()嵌套循环的解决方案。这不会是最有效的一个,但它是不是真的慢。取决于任务的大小,当然。

您“创建结合两个记录功能”,可以在创建它接受,也就是说,十个参数做出更加有效。修改SQL上飞:

<cfset var local = StructNew()>

<cfquery name="local.union" dbtype="query">
  SELECT * FROM argument1
  <cfloop from="2" to="#ArrayLen(arguments)#" index="local.i">
    <cfif IsQuery(arguments[local.i])>
      UNION
      SELECT * FROM argument#local.i#
    </cfif>
  </cfloop>
</cfquery>

<cfreturn local.union>

其他提示

之后,张贴的问题,我想出了一对夫妇的解决方案,但有可能是一个更好的人在那里

  • 我可以写的动态名为变量的参数范围,然后参照他们没有他们的范围在查询

  • 创建一个能接受2记录作为参数和返回的一个联合记录集。这可能是循环,逐步添加一个记录集在一段时间。我敢肯定这是非常没有效率的比较来做的所有工会在一次查询。

闲逛的快速一点后,我发现这一点: queryConcat 在CFLib.org。它使用queryaddrow / querysetcell连接两个查询。

我添加了一个快速功能(没有错误检查,或数据验证,所以原样我不会使用它):

<cffunction name="concatenate">
     <cfset var result = arguments[1]>
     <cfloop from="2" to="#arraylen(arguments)#" index="i">
             <cfset result=queryconcat(result, arguments[i])>
     </cfloop>
     <cfreturn result>
 </cffunction>

作为试验,我把这种在一起:

哪些呢,其实,给你弗雷德/森/弗雷德。

这可能不是最有效的实现,但你总是可以改变插入件/组织机构代码,使其更快,如果你想要的。大多数情况下,我的目标是我自己写的少的代码越好。 : - )

所有在这里添加的解决方案,应该为你工作,但我还要提到的是取决于你有多少数据与工作和数据库使用的是,你可能会更好试图找到一种方式来完成此操作在数据库方面。具有非常大的记录集,它可能是有益的记录写入到一个临时表,然后再次选择出来,但无论哪种方式,如果你能以任何方式重写查询以让数据库中,你将是第一个地方处理这个问题更好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top