Sql server 重写查询以避免子查询

Sql server 重写查询以避免子查询,sql-server,Sql Server,我需要重写下面的查询,避免子查询。我应该怎么做…下面的查询中有两个子查询 select cc1.claimid as claimid, cc1.createdate as createdate, cc1.condcode as condition_cd1, cc2.condcode as condition_cd2, cc3.condcode as condition_cd3 from claimcond cc1 (nolock) left outer join cla

我需要重写下面的查询,避免子查询。我应该怎么做…下面的查询中有两个子查询

select  
  cc1.claimid as claimid,
  cc1.createdate as createdate,
  cc1.condcode as condition_cd1,
  cc2.condcode as condition_cd2,
  cc3.condcode as condition_cd3

from claimcond cc1 (nolock)
left outer join claimcond cc2 (nolock) on 
cc1.claimid = cc2.claimid 
and cc2.condcode = (select min(condcode) from claimcond cc (nolock) where cc1.claimid = cc.claimid)
and cc1.condcode <> cc2.condcode

left outer join claimcond cc3 (nolock) on 
cc1.claimid = cc3.claimid 
and cc3.condcode in (select min(condcode) from claimcond cc (nolock) where cc1.claimid = cc.claimid 
and ((cc.condcode > cc2.condcode)))
and cc1.condcode <> cc3.condcode

ORDER BY cc1.claimid, cc1.condcode DESC 
存在:

select  
  cc1.claimid as claimid,
  cc1.createdate as createdate,
  cc1.condcode as condition_cd1,
  cc2.condcode as condition_cd2,
  cc3.condcode as condition_cd3

from claimcond cc1 (nolock)
left outer join claimcond cc2 (nolock) on 
cc1.claimid = cc2.claimid 
and cc1.condcode <> cc2.condcode

left outer join claimcond cc3 (nolock) on 
cc1.claimid = cc3.claimid 

and ((cc.condcode > cc2.condcode)))
and cc1.condcode <> cc3.condcode
WHERE EXISTS (
    SELECT '1'
    FROM claimcond cc (nolock)
    WHERE cc1.claimid = cc.claimid and -- Maybe OR 
          cc2.claimID = cc.claimid )

ORDER BY cc1.claimid, cc1.condcode DESC 

您应该看到它是如何执行的:

DECLARE @MinCondCode TABLE (
    claimid INT,                --datatype correct?
    MinCode1 VARCHAR(20) NULL,  --datatype correct?
    MinCode2 VARCHAR(20) NULL   --datatype correct?
)

INSERT INTO @MinCondCode (claimid,MinCode1)
    select claimid,min(condcode)
    from claimcond cc (nolock)
    group by claimid

UPDATE MinCondCode
SET MinCode2=(
    select min(condcode)
    from claimcond cc (nolock)
    WHERE cc.condcode > MinCondCode.MinCode1
    AND MinCondCode.claimid = cc.claimid 
)

select  
  cc1.claimid as claimid,
  cc1.createdate as createdate,
  cc1.condcode as condition_cd1,
  cc2.condcode as condition_cd2,
  cc3.condcode as condition_cd3
from claimcond cc1 (nolock)
INNER JOIN @MinCondCode mn on mn.claimid=cc1.claimid
left outer join claimcond cc2 (nolock) on cc1.claimid = cc2.claimid 
    and cc2.condcode = mn.MinCode1
    and cc1.condcode <> cc2.condcode
left outer join claimcond cc3 (nolock) on cc1.claimid = cc3.claimid 
    and cc3.condcode = mn.MinCode2
    and cc1.condcode <> cc3.condcode
ORDER BY cc1.claimid, cc1.condcode DESC 

获取错误消息8120,级别16,状态1,第8行列“claimcond.claimid”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。消息157,级别15,状态1,第12行UPDATE语句的集合列表中可能不会出现聚合。获取错误。。。。Msg 4104,级别16,状态1,第16行无法绑定多部分标识符cc.condcode。它是此行:和cc.condcode>cc2.condcode