如何合并查询结果?

How to combine query results?

我有三个关联在一起的查询。最终输出需要对查询进行多次循环。这种方式工作得很好,但在我看来似乎非常低效且过于复杂。这是我拥有的:

查询 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

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

  • qryTypes returns X 条记录
  • qryLocationreturns Y条记录

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

  • qryFunds returns Z 记录

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

每 return 秒的数据越多,您 运行 的查询就越多。显然不好。

如果您只需要每个类别的最终总计,在存储过程中,您可以使用 qryTypesqryLocation 中的合并数据创建临时 table。然后你的最后一个 qryFunds 就加入了那个临时 table 数据。

SELECT 
    sum(budget) AS budget
FROM 
    funds f
INNER JOIN 
    #TEMP_TABLE t ON t.location_id = f.location_id
AND 
    nofa_id = 45

如果需要,您可以从临时 table 中获得其他金额。有可能所有这些都可以处理到一个查询中,但也许这可以帮助您实现目标。

此外,一个存储过程可以 return 多个记录集,因此您可以有一个 return 聚合 table 金额数据和第二个 return 总计.这会将所有计算保留在数据库上,不需要 CF 参与。