T-SQL多连接替代方案

T-SQL多连接替代方案,sql,sql-server,Sql,Sql Server,我有两个表,Policy和CoverageCoverage(policyID)是引用Policy(policyID)的外键覆盖范围也有列covTypeID和Incomered。每个保单有多个保险范围。我编写了一个查询来连接这些表,每个策略只有一行。这就是我想到的: select polNo, alIncur, apdIncur, cargoIncur from Policy as P left join ( select policyID, incurred as alIncur fro

我有两个表,
Policy
Coverage
Coverage(policyID)
是引用
Policy(policyID)
的外键<代码>覆盖范围也有列
covTypeID
Incomered
。每个保单有多个保险范围。我编写了一个查询来连接这些表,每个策略只有一行。这就是我想到的:

select polNo, alIncur, apdIncur, cargoIncur
from Policy as P
left join (
  select policyID, incurred as alIncur
  from Coverage
  where covTypeID = 1
) as ALC on ALC.policyID = P.policyID
left join (
  select policyID, incurred as apdIncur
  from Coverage
  where covTypeID = 2
) as APDC on APDC.policyID = P.policyID
left join (
  select policyID, incurred as cargoIncur
  from Coverage
  where covTypeID = 3
) as CARGOC on CARGOC.policyID = P.policyID;

我知道这个查询在覆盖率表中进行了三次单独的传递,我听说
JOIN
s也非常慢。我怀疑有一种更快的方法可以实现这一点,我想知道最好的做法是什么。

您可以在不使用子查询的情况下重写查询,但我认为这不会影响性能:

select p.polNo, ALC.alIncur, APDC.apdIncur, CARGOC.cargoIncur
from Policy P left join 
     Coverage ALC
     on ALC.policyID = P.policyID and ALC.covTypeID = 1 left join
     Coverage APDC
     on APDC.policyID = P.policyID and APDC.covTypeID = 2 left join
     Coverage CARGOC
     on CARGOC.policyID = P.policyID and CARGOC.covTypeID = 3;
如果您在
Coverage(PolicyId,covTypeID)
上有索引,则此查询将具有良好的性能

一种选择是将不同的覆盖范围放在不同的行上:

select p.polNo, c.covTypeID,
       (case when c.covTypeID = 1 then 'ALC'
             when c.covTypeID = 2 then 'APDC'
             when c.covTypeID = 3 then 'CARGOC'
        end) as which
from Policy P left join 
     Coverage c
     on c.policyID = P.policyID
where c.covTypeID in (1, 2, 3);

谢谢你的重写,它比我的要简洁得多。那么你认为没有办法提高绩效吗?我知道这对我的应用程序来说不会太慢,但为了了解情况,我想知道。一个表上使用正确索引的三个连接应该非常快。在这种情况下,我不会担心性能。