如何合并查询结果?

时间:2019-03-21 13:13:48

标签: stored-procedures coldfusion sybase coldfusion-11

我将三个查询捆绑在一起。最终输出需要对查询进行多次循环。这种方式效果很好,但在我看来似乎效率很低而且太复杂。这是我所拥有的:

查询1:

<cfquery name="qryTypes" datasource="#application.datasource#">
   SELECT 
      t.type_id, 
      t.category_id,
      c.category_name, 
      s.type_shortcode
   FROM type t
      INNER JOIN section s 
         ON s.type_id = t.type_id
      INNER JOIN category c 
         ON c.category_id = t.category_id
   WHERE t.rec_id = 45 -- This parameter is passed from form field.
   ORDER BY s.type_name,c.category_name
</cfquery>

查询类型将产生以下结果:

4   11  SP  PRES
4   12  CH  PRES
4   13  MS  PRES
4   14  XN  PRES

然后遍历查询类型,并为每个匹配的记录从另一个查询中获取记录:

查询2:          

<cfloop query="qryTypes">
   <cfquery name="qryLocation" datasource=#application.datasource#>
      SELECT l.location_id, l.spent_amount
      FROM locations l
      WHERE l.location_type = '#trim(category_name)#' 
         AND l.nofa_id = 45 -- This is form field    
         AND l.location_id = '#trim(category_id)##trim(type_id)#'
      GROUP BY l.location_id,l.spent_amount
      ORDER BY l.location_id ASC
   </cfquery>

   <cfset spent_total = arraySum(qryLocation['spent_amount']) />
   <cfset amount_total = 0 />

   <cfloop query="qryLocation">           
      <cfquery name="qryFunds" datasource=#application.datasource#>
         SELECT sum(budget) AS budget
         FROM funds f
         WHERE f.location_id= '#qryLocation.location_id#' 
            AND nofa_id = 45
      </cfquery>

      <cfscript>
         if(qryFunds.budgetgt 0) {
            amount_total = amount_total + qryFunds.budget;
         }
      </cfscript>
   </cfloop>

   <cfset GrandTotal = GrandTotal + spent_total />
   <cfset GrandTotalad = GrandTotalad + amount_total />
</cfloop>

循环完成后,结果如下:

CATEGORY NAME   SPENT TOTAL   AMOUNT TOTAL
      SP           970927         89613
      CH           4804           8759
      MS           9922           21436
      XN           39398          4602
   Grand Total:    1025051        124410

是否有一个很好的方法可以将其合并在一起,并且只有一个查询而不是三个查询和内部循环?我想知道这是否适合存储过程,然后在那里进行所有数据操作?如果有人有建议,请告诉我。

1 个答案:

答案 0 :(得分:4)

  • ldd返回X条记录
  • qryTypes返回Y记录

到目前为止,您已经运行(1 + X)个查询。

  • qryLocation返回Z记录

现在您已经运行(1 + X)(Y)个查询。

每个返回的数据越多,您将运行的查询越多。显然不好。

如果您想要的只是每个类别的最终总数,则在存储过程中,您可以创建一个临时表,其中包含来自qryFundsqryTypes的联接数据。然后,将最后一个qryLocation与该临时表数据连接在一起。

qryFunds

如果需要,您可以从临时表中获取其他总和。可能所有这些都可以处理成一个查询,但这也许可以帮助您到达那里。

此外,存储过程可以返回多个记录集,因此您可以让一个返回聚合表数量数据,第二个返回总计。这样可以将所有计算保留在数据库中,而无需涉及CF。