我有四个以完全相同的方式计算的sql变量,除了每个查询的一个条件:
C.CenterID = @CenterID
C.CenterNo IN (SELECT CenterNo from Registry.Vol1_5)
C.CenterNo IN (SELECT CenterNo from Registry.Vol6_10)
C.CenterNo IN (SELECT CenterNo from Registry.Vol11)
我的代码在这里:
DECLARE @MyCenterAllComplications INT;
DECLARE @Total5AllComplications INT;
DECLARE @Total6_10AllComplications INT;
DECLARE @Total11AllComplications INT;
SET @MyCenterAllComplications = (SELECT count(*) FROM ECLS.Runs R
INNER JOIN Registry.Patients P on R.PatientId = P.PatientId
INNER JOIN Registry.CenterPatients CP ON CP.PatientId = P.PatientId
INNER JOIN Registry.Centers C on C.CenterId = CP.CenterId
where 1 = 1
AND NOT R.RunId IN (select RD.RunId from ECLS.RunDetails RD
INNER JOIN ECLS.ModeCodes MC ON RD.Mode = MC.Code AND MC.Abbreviation IN ('AVCO2R', 'VVCO2R')
)
AND C.CenterID = @CenterID
AND R.SupportType = @SupportType
AND NOT R.CompletedBy IS NULL
AND NOT R.TimeOn IS NULL
AND DATEDIFF(year, R.timeOn, GETDATE()) < 10
AND DATEDIFF(day, P.Birthdate, R.timeOn) <= 30
);
SET @Total5AllComplications = (SELECT count(*) FROM ECLS.Runs R
INNER JOIN Registry.Patients P on R.PatientId = P.PatientId
INNER JOIN Registry.CenterPatients CP ON CP.PatientId = P.PatientId
INNER JOIN Registry.Centers C on C.CenterId = CP.CenterId
where 1 = 1
AND NOT R.RunId IN (select RD.RunId from ECLS.RunDetails RD
INNER JOIN ECLS.ModeCodes MC ON RD.Mode = MC.Code AND MC.Abbreviation IN ('AVCO2R', 'VVCO2R')
)
AND C.CenterNo IN (SELECT CenterNo from Registry.Vol1_5)
AND R.SupportType = @SupportType
AND NOT R.CompletedBy IS NULL
AND NOT R.TimeOn IS NULL
AND DATEDIFF(year, R.timeOn, GETDATE()) < 10
AND DATEDIFF(day, P.Birthdate, R.timeOn) <= 30
);
SET @Total6_10AllComplications = (SELECT count(*) FROM ECLS.Runs R
INNER JOIN Registry.Patients P on R.PatientId = P.PatientId
INNER JOIN Registry.CenterPatients CP ON CP.PatientId = P.PatientId
INNER JOIN Registry.Centers C on C.CenterId = CP.CenterId
where 1 = 1
AND NOT R.RunId IN (select RD.RunId from ECLS.RunDetails RD
INNER JOIN ECLS.ModeCodes MC ON RD.Mode = MC.Code AND MC.Abbreviation IN ('AVCO2R', 'VVCO2R')
)
AND C.CenterNo IN (SELECT CenterNo from Registry.Vol6_10)
AND R.SupportType = @SupportType
AND NOT R.CompletedBy IS NULL
AND NOT R.TimeOn IS NULL
AND DATEDIFF(year, R.timeOn, GETDATE()) < 10
AND DATEDIFF(day, P.Birthdate, R.timeOn) <= 30
);
SET @Total11AllComplications = (SELECT count(*) FROM ECLS.Runs R
INNER JOIN Registry.Patients P on R.PatientId = P.PatientId
INNER JOIN Registry.CenterPatients CP ON CP.PatientId = P.PatientId
INNER JOIN Registry.Centers C on C.CenterId = CP.CenterId
where 1 = 1
AND NOT R.RunId IN (select RD.RunId from ECLS.RunDetails RD
INNER JOIN ECLS.ModeCodes MC ON RD.Mode = MC.Code AND MC.Abbreviation IN ('AVCO2R', 'VVCO2R')
)
AND C.CenterNo IN (SELECT CenterNo from Registry.Vol11)
AND R.SupportType = @SupportType
AND NOT R.CompletedBy IS NULL
AND NOT R.TimeOn IS NULL
AND DATEDIFF(year, R.timeOn, GETDATE()) < 10
AND DATEDIFF(day, P.Birthdate, R.timeOn) <= 30
);
如何计算所有这些变量
@MyCenterAllComplications,
@Total5AllComplications,
@Total6_10AllComplications,
@Total11AllComplications
同时,通过使用一个查询?提前感谢您的帮助。
答案 0 :(得分:2)
您可以使用CASE EXPRESSION
的条件聚合将所有这些查询合并为1:
SELECT @MyCenterAllComplications = SUM(MyCenterAllComplications) ,
@Total5AllComplications = SUM(Total5AllComplications),
.......
FROM(
SELECT CASE WHEN C.CenterID = @CenterID THEN 1 ELSE 0 END as MyCenterAllComplications ,
CASE WHEN C.CenterNo IN (SELECT CenterNo from Registry.Vol1_5) THEN 1 ELSE 0 END as Total5AllComplications ,
....
FROM ECLS.Runs R
INNER JOIN Registry.Patients P on R.PatientId = P.PatientId
INNER JOIN Registry.CenterPatients CP ON CP.PatientId = P.PatientId
INNER JOIN Registry.Centers C on C.CenterId = CP.CenterId
where 1 = 1
AND NOT R.RunId IN (select RD.RunId from ECLS.RunDetails RD
INNER JOIN ECLS.ModeCodes MC ON RD.Mode = MC.Code AND MC.Abbreviation IN ('AVCO2R', 'VVCO2R')
)
AND R.SupportType = @SupportType
AND NOT R.CompletedBy IS NULL
AND NOT R.TimeOn IS NULL
AND DATEDIFF(year, R.timeOn, GETDATE()) < 10
AND DATEDIFF(day, P.Birthdate, R.timeOn) <= 30)
除此之外,您应该发布此查询和表结构的解释计划,以便我们可以告诉您表中是否缺少任何索引。
答案 1 :(得分:1)
SELECT count(cID.ID)
, count(Registry.Vol1_5.CenterNo)
, count(Registry.Vol6_10.CenterNo)
, count(on Registry.Vol11.CenterNo)
FROM ECLS.Runs R
INNER JOIN Registry.Patients P
on R.PatientId = P.PatientId
AND R.SupportType = @SupportType
AND NOT R.CompletedBy IS NULL
AND NOT R.TimeOn IS NULL
AND DATEDIFF(year, R.timeOn, GETDATE()) < 10
AND DATEDIFF(day, P.Birthdate, R.timeOn) <= 30
AND NOT R.RunId IN (select RD.RunId
from ECLS.RunDetails RD
INNER JOIN ECLS.ModeCodes MC
ON RD.Mode = MC.Code
AND MC.Abbreviation IN ('AVCO2R', 'VVCO2R')
)
INNER JOIN Registry.CenterPatients CP ON CP.PatientId = P.PatientId
INNER JOIN Registry.Centers C on C.CenterId = CP.CenterId
LEFT JOIN (select @CenterID as ID
) cID
on cID.ID = C.CenterNo
LEFT JOIN Registry.Vol1_5
on Registry.Vol1_5.CenterNo = C.CenterNo
LEFT JOIN Registry.Vol6_10
on Registry.Vol6_10.CenterNo = C.CenterNo
LEFT JOIN Registry.Vol11
on Registry.Vol11.CenterNo = C.CenterNo
答案 2 :(得分:0)
仅了解您的查询是不够的,它需要知道如何构建您的数据库。
一般响应可能是:读取查询执行计划并检查是否需要索引: https://technet.microsoft.com/en-us/library/ms178071(v=sql.105).aspx
要查看执行计划,请单击结果窗格中的“执行计划”选项卡。 SQL Server Management Studio中的图形执行计划输出从右到左,从上到下读取。将显示分析批次中的每个查询,包括每个查询的成本占批次总成本的百分比。