TSQL选择历史链中记录的所有数据

时间:2014-08-14 15:16:41

标签: sql sql-server tsql

我有一个存储在数据库中的保险单列表。如果策略是续订,我有一个表将该策略连接到其先前(更新)的策略。表格如下所示:

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上的选择查询。不幸的是,这不是我收到数据的方式。

2 个答案:

答案 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

SQL Fiddle

答案 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