如何合并查询结果?
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 条记录
qryLocation
returns Y条记录
到目前为止,您有 运行 (1 + X) 个查询。
qryFunds
returns Z 记录
现在您有 运行 (1 + X)(Y) 个查询。
每 return 秒的数据越多,您 运行 的查询就越多。显然不好。
如果您只需要每个类别的最终总计,在存储过程中,您可以使用 qryTypes
和 qryLocation
中的合并数据创建临时 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 参与。
我有三个关联在一起的查询。最终输出需要对查询进行多次循环。这种方式工作得很好,但在我看来似乎非常低效且过于复杂。这是我拥有的:
查询 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 条记录qryLocation
returns Y条记录
到目前为止,您有 运行 (1 + X) 个查询。
qryFunds
returns Z 记录
现在您有 运行 (1 + X)(Y) 个查询。
每 return 秒的数据越多,您 运行 的查询就越多。显然不好。
如果您只需要每个类别的最终总计,在存储过程中,您可以使用 qryTypes
和 qryLocation
中的合并数据创建临时 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 参与。