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