我有一个存储在数据库中的保险单列表。如果策略是续订,我有一个表将该策略连接到其先前(更新)的策略。表格如下所示:
CREATE TABLE [Policies]
(
[ID] [int] NOT NULL PRIMARY KEY,
[SomeData] [int] NOT NULL
)
CREATE TABLE [PriorPolicies]
(
[ID] [int] NOT NULL PRIMARY KEY FOREIGN KEY REFERENCES [Policies](ID),
[PriorID] [int] NOT NULL FOREIGN KEY REFERENCES [Policies](ID)
)
根据策略,我想为历史记录中的每个策略编写一个获取SomeData
的查询。 IE:如果策略8是策略4的更新,这是策略1的更新,我希望获得策略1,4和8的SomeData
。它们应该每个都显示为它们自己的记录而不是聚合
如何使用TSQL实现此目的?
注意:我知道有更好的方法来表示这些数据。我们应该有一个包含唯一保险的Insured
表,然后策略表可以有一个InsuredID
外键。然后获取历史链只需要InsuredID
上的选择查询。不幸的是,这不是我收到数据的方式。
答案 0 :(得分:2)
您需要使用CTE。假设您希望获得策略5的所有历史记录,则应该这样做:
WITH PolicyChain (PrevID, FinalId) as
(
select PriorID, ID
from PriorPolicies
union all
select p.PriorID, pc.FinalID
from PriorPolicies p
inner join PolicyChain pc on pc.PrevID = p.ID
)
select p.*
from Policies p
inner join PolicyChain pc on pc.PrevID = p.ID
where pc.FinalId = 5
union all
select *
from Policies
where Id = 5
答案 1 :(得分:1)
如果5在8之前,1在5之前,以下将给你8,5和1:
WITH CTE (ID, SomeData)
AS
(
SELECT
ID,
SomeData
FROM Policies
WHERE
ID = 8
UNION ALL
SELECT
P.ID,
P.SomeData
FROM CTE
INNER JOIN PriorPolicies AS PP
ON CTE.ID = PP.ID
INNER JOIN Policies AS P
ON P.ID = PP.PriorID
)
SELECT
ID,
SomeData
FROM CTE