Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用一个结果集从该结果集生成多个操纵结果集,而无需多次点击数据库?_Sql_Sql Server_Sql Server 2008_Coldfusion_Qoq - Fatal编程技术网

Sql 如何使用一个结果集从该结果集生成多个操纵结果集,而无需多次点击数据库?

Sql 如何使用一个结果集从该结果集生成多个操纵结果集,而无需多次点击数据库?,sql,sql-server,sql-server-2008,coldfusion,qoq,Sql,Sql Server,Sql Server 2008,Coldfusion,Qoq,我正在使用ColdFusion和SQL设计一个报表。报告有三个部分。现在,所有3个部分都使用相同的数据集,但操作方式不同 以显示不同的结果。我用过CTE。我已经为3个部分写了3个要求 WITH allOrders AS( Main query[With a lot of Joins] ) SELECT [Manupulated_Resultset_1] FROM allOrders WITH allOrders AS( Main query[With a lot of Joi

我正在使用ColdFusion和SQL设计一个报表。报告有三个部分。现在,所有3个部分都使用相同的数据集,但操作方式不同 以显示不同的结果。我用过CTE。我已经为3个部分写了3个要求

WITH allOrders AS(  
Main query[With a lot of Joins]
)
SELECT  [Manupulated_Resultset_1]
FROM    allOrders 

WITH allOrders AS(  
Main query[With a lot of Joins]
)
SELECT  [Manupulated_Resultset_2]
FROM    allOrders 

WITH allOrders AS(  
Main query[With a lot of Joins]
)
SELECT  [Manupulated_Resultset_3]
FROM    allOrders 
因此,对于这三个部分,它将对数据库进行3次访问,其中对于所有情况,主查询保持不变,只有子查询发生更改。 我知道这可以用更好的方法来实现。所以我需要一种方法来存储主查询结果一次,然后使用它来获得不同的结果 结果

我不能在ColdFusion中使用query of query来获得被操纵的结果集,因为它涉及很多QOQ不支持的操作


SQL中有什么方法可以做到这一点吗?

创建一个存储过程,使用临时表存储主查询的结果,然后一次性将多个结果集返回给客户端:

create procedure proc_name
as
set nocount on
;with allOrders as (  
Main query[With a lot of Joins]
)
select *
into #allOrders
from allOrders;

SELECT  [Manupulated_Resultset_1]
FROM    #allOrders;
SELECT  [Manupulated_Resultset_2]
FROM    #allOrders;
SELECT  [Manupulated_Resultset_3]
FROM    #allOrders;

GO

创建一个存储过程,使用临时表存储主查询的结果,然后一次性将多个结果集返回给客户端:

create procedure proc_name
as
set nocount on
;with allOrders as (  
Main query[With a lot of Joins]
)
select *
into #allOrders
from allOrders;

SELECT  [Manupulated_Resultset_1]
FROM    #allOrders;
SELECT  [Manupulated_Resultset_2]
FROM    #allOrders;
SELECT  [Manupulated_Resultset_3]
FROM    #allOrders;

GO
使用查询的查询 或者创建一个连接必要表的DB视图,这样您就可以将一些资源分配给DB端。最佳实践是存储过程

使用查询查询
或者创建一个连接必要表的DB视图,这样您就可以将一些资源分配给DB端。最佳实践是存储过程

回答得很好,但是临时表是必需的吗?你不能简单地从cte中选择吗?@DanBracuk嗯,cte是语句范围的,所以不能有三个单独的select语句使用同一个cte。如果您设法将其打包为一个(例如,使用union all),临时表解决方案仍将优于CTE解决方案,原因有两个:第一,将中间结果具体化为临时表将为优化器提供准确的基数,第二,每次您在查询中提到CTE时,CTE中的代码都会被执行,而临时表方法只执行一次。回答得好,但是临时表是必要的吗?你不能简单地从cte中选择吗?@DanBracuk嗯,cte是语句范围的,所以不能有三个单独的select语句使用同一个cte。如果您设法将其打包为一个(例如,使用union all),临时表解决方案仍将优于CTE解决方案,原因有两个:第一,将中间结果具体化为临时表将为优化器提供准确的基数,第二,每次您在查询中提到CTE时,CTE中的代码都会被执行,而临时表方法只执行一次。