从一个表中的数据递归查找原始ID

时间:2018-10-19 15:10:30

标签: sql-server tsql

首先查看我想要实现的简单数据和预期结果:

样本数据

Id          ParentId    Mode
----------- ----------- ---------
28          0           A
29          30          B
30          0           R
31          32          C
32          33          T
33          34          Y
34          0           G

我可以使用以下查询获得预期结果:

select 
    t1.Id,
    coalesce(t5.Id,t4.Id,t3.Id,t2.Id,t1.Id) as BaseId,
    coalesce(t5.Mode,t4.Mode,t3.Mode,t2.Mode,t1.Mode) as BaseMode
from
    #Table t1
left join 
    #Table t2 on t2.ParentId = t1.Id
left join 
    #Table t3 on t3.ParentId = t2.Id
left join 
    #Table t4 on t4.ParentId = t3.Id
left join 
    #Table t5 on t5.ParentId = t4.Id

预期结果:

Id          BaseId      BaseMode
----------- ----------- ---------
28          28          A
29          29          B
30          29          B
31          31          C
32          31          C
33          31          C
34          31          C

但是问题是-我不知道我必须离开多少次。 我可以是任何数字。

我尝试使用递归cte-但这使我震惊。我发现有一个问题需要解决。谁能告诉我如何实现它?

以下是可粘贴到管理工作室中的简单数据:

select * 
into #Table
from (select 28 as Id, 0 as ParentId, 'A' as Mode
union all select 29, 30, 'B'
union all select 30, 0, 'R'
union all select 31, 32, 'C'
union all select 32, 33, 'T'
union all select 33, 34, 'Y'
union all select 34, 0, 'G') data

1 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

public class sample {   
    public static void main(String[] args) {
        try {
            String input= "201700" + "00";
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
            Date d = sdf1.parse(input);
            System.out.print(d);
            String formateDate = new SimpleDateFormat("MM/dd/yyyy hh:mm").format(d);

            System.out.print(formateDate);
        } catch(Exception e) {}
    }
}

当然,可以通过许多方式进行改进。这只是一个例子。递归级别是有限制的,只是为了拥有更强大的查询。