Sql 消除子查询
我正在寻找一种可能的方法来消除子查询 任何评论都会有帮助Sql 消除子查询,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我正在寻找一种可能的方法来消除子查询 任何评论都会有帮助 SELECT [FacilityGroupID] ,[LocationGroupID] ,[MsrID] ,CAST(LEFT([ReportingPeriod],4) + '-' + RIGHT([ReportingPeriod],2) + '-01' as datetime) as create_timestamp ,SUM([D
SELECT
[FacilityGroupID]
,[LocationGroupID]
,[MsrID]
,CAST(LEFT([ReportingPeriod],4) + '-'
+ RIGHT([ReportingPeriod],2)
+ '-01' as datetime) as create_timestamp
,SUM([Denominator]) as [Denominator]
,SUM([Numerator]) as [Numerator]
FROM
(
SELECT
DISTINCT
Tob.FacilitygroupId
,Tob.LocationgroupId
,Tob.Reportingperiod
,Tob.Denominator
,DimIndicator.MsrId
,CASE
WHEN DimIndicator.MsrID = Tob.MsrId THEN 1
ELSE 0
END as Numerator
from
BIReport.dbo.vIndianatest "Tob"
INNER JOIN [BIreport].[dbo].[DimIndicator] "DimIndicator"
on Tob.MsrSubGroupId = DimIndicator.MsrSubGroupId
) as "Inner"
GROUP BY
[FacilityGroupID]
,[LocationGroupID]
,[MsrID]
,CAST(LEFT([ReportingPeriod],4) + '-'
+ RIGHT([ReportingPeriod],2)
+ '-01' as datetime)
与子查询一样,性能太慢
谢谢 您是否尝试过使用
<使用
对内联视图进行子查询
与
的一般用法:
with clausename AS
(
subquery
)
main query referencing clausename;
例如:
-- define with clause
with saletot as
(
select dname, sum(sal) as dept_total
from emp, dept
where emp.deptno = dept.deptno
group by dname
)
-- Main query which use the with clause
select dname, dept_total
from saletot -- Reference to with clause
order by dept_total desc;
您是否尝试过删除不同的
?还请发布查询的解释计划。从内部查询中求和的分母和分子值将在外部查询中求和。如果只运行嵌套的select,是否太慢?您看过索引了吗?我知道您试图在转换之前将日期/时间作为“国际”(ISO)格式,但不幸的是,SQL Server认为该特定格式仍然可以本地化(检查第一个)-最好删除破折号。另外,ReportingPeriod
是否已经是日期/时间类型?也许有一个更好(性能更好)的函数可以在本月初使用;如中所示,可能还有其他解决方案可以提高性能。如果对select使用with子句,则在发生联接的位置,联接只运行一次,我认为是这样。我的意思是:使用INTERNAR as select DISTINCT Tob.FacilitygroupId。。。从BIReport.dbo.vIndianatest“Tob”内部联接[BIReport].[dbo].[DimIndicator]“DimIndicator”。。。通过…@OliC从内部组中选择[FacilityGroupID]、[LocationGroupID]、SUM([Denominor])作为[Denominor]、SUM([Numerator])作为[Numerator]。-感谢您的输入