带有子查询优化的SQL QUERY

时间:2016-01-04 06:07:15

标签: sql

如何优化这些查询

SELECT
mp.ProviderName
,(SELECT count(mc.ClaimSubmissionID) FROM dbo.MST_Claim mc WHERE   mc.HeaderID=mpach.HeaderID AND mc.IsActive=1) AS total_claim
,(SELECT count(mc.ClaimSubmissionID) FROM dbo.MST_Claim mc WHERE mc.HeaderID=mpach.HeaderID AND mc.op=1) AS total_op
,(SELECT count(mc.ClaimSubmissionID) FROM dbo.MST_Claim mc WHERE mc.HeaderID=mpach.HeaderID AND mc.ip=1) AS total_ip

FROM dbo.MST_PriorAuthorization_Claim_Header mpach
INNER JOIN dbo.MS_Provider mp ON mp.Provider_ID = mpach.Provider_ID

2 个答案:

答案 0 :(得分:1)

使用CASE Statements之和来避免所有这些子查询。

SELECT
    mp.ProviderName,
    SUM(CASE WHEN mc.IsActive=1 THEN 1 ELSE 0 END ) AS total_claim,
    SUM(CASE WHEN mc.op=1 THEN 1 ELSE 0 END ) AS total_op,
    SUM(CASE WHEN mc.ip=1 THEN 1 ELSE 0 END ) AS total_ip
FROM dbo.MST_PriorAuthorization_Claim_Header mpach
    INNER JOIN dbo.MS_Provider mp ON mp.Provider_ID = mpach.Provider_ID
    INNER JOIN dbo.MST_Claim mc ON  mc.HeaderID=mpach.HeaderID

答案 1 :(得分:0)

您可以使用CASE语句修改查询,如下所示

SELECT
mp.ProviderName
,sum(case when mc.IsActive=1 then mc.ClaimSubmissionID else 0 end) AS total_claim,
sum(case when mc.op=1 then mc.ClaimSubmissionID else 0  end) AS total_op
sum(case when mc.ip=1 then mc.ClaimSubmissionID else 0  end) AS total_ip

FROM dbo.MST_PriorAuthorization_Claim_Header mpach
INNER JOIN dbo.MS_Provider mp ON mp.Provider_ID = mpach.Provider_ID
JOIN dbo.MST_Claim mc ON mc.HeaderID = mpach.HeaderID;