【发布时间】:2016-06-22 10:57:19
【问题描述】:
我有四个以完全相同的方式计算的 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
同时,通过使用一个查询?提前感谢您的帮助。
【问题讨论】:
-
不需要 where 1 = 1,我不确定是否将所有选择合并到一个查询中,但是您可以将初始重复的选择语句拉回临时表以节省检索 4 次
-
请在此处查看如何改进问题:stackoverflow.com/help/mcve
标签: sql sql-server tsql query-optimization