SQL从顶级子记录中选择值

时间:2016-12-29 18:16:46

标签: sql sql-server tsql

以下是我的表

表A

Signature Parent
001
002        001
003        002
004        002
005        001
006        003
007       
008        007
009        008

现在我需要从每个孩子的顶级记录(这一个没有父母)获得签名。我可以称之为OrgSignature。 OrgSignature对每个孩子都是一样的。

Signature Parent OrgSignature
001
002        001       001
003        002       001
004        002       001
005        001       001
006        003       001
007
008        007       007
009        008       007

那么例如如何将001签名作为OrgSignature获取006记录?

我不知道如何更好地解释这一点......在表A中我有一些父母的记录和一些没有父母的记录。对于每条记录,我都可以创建孩子:

001 -> 002
            -> 004
            -> 005
    -> 003
            -> 006
                    -> 007

记录002-007之间存在关系,但是对于每条记录,有1条最高记录 - 001.我需要为此层次结构中的每个孩子获得此顶级记录签名。

1 个答案:

答案 0 :(得分:1)

我认为这里需要一个递归的cte来考虑你的hier的可变深度

Declare @Hier table (Signature varchar(10),Parent varchar(10))
Insert into @Hier values 
('001', null),
('002','001'),
('003','002'),
('004','002'),
('005','001'),
('006','003'),
('007', null),
('008','007'),
('009','008')

;with cteP as (
      Select OrgSignature   = Signature
            ,Signature
            ,Parent
      From   @Hier 
      Where  Parent is null
      Union  All
      Select p.OrgSignature
            ,r.Signature
            ,r.Parent
      From   @Hier r
      Join   cteP p on r.Parent = p.Signature)
Select A.Signature
      ,A.Parent
      ,OrgSignature = case when Parent is null then null else A.OrgSignature end
 From cteP A
 Order By 1

返回

enter image description here