Oracle "start with" 自底向上递归 SQL 服务器等效

Oracle "start with" bottom to top recursion SQL Server equivalent

我看到很多帖子介绍如何将 Oracle "connect by prior" 语句转换为 SQL 服务器通用 table 表达式。但是,我有一个 Oracle "connect by prior" 语句,上面有一个 "start with fieldname in ('value1','value2','value3')" 子句,但我没有看到任何关于如何将其转换为 SQL 服务器的示例。我相信这被认为是 "bottom to top" 递归。

这是我的 Oracle 查询:

select distinct KEY
from MY_HIERARCHICAL_TABLE
connect by prior PARENT_KEY = KEY
start with KEY in ('CHILD-A1','CHILD-C1')

样本table:

MY_HIERARCHICAL_TABLE
---------------------
KEY
PARENT_KEY

示例数据:

KEY       PARENT_KEY
--------- ----------
TOP       null
PARENT-A  TOP
CHILD-A1  PARENT-A
CHILD-A2  PARENT-A
PARENT-B  TOP
CHILD-B1  PARENT-B
PARENT-C  TOP
CHILD-C1  PARENT-C

我的查询应该按如下方式工作:

希望我已经解释清楚了。今天我一直在寻找适合这个的例子。任何输入将不胜感激。

很容易select记录,不知道如何对它们进行排序

with 
param as (
  select *
  from ( values 
        ('CHILD-A1'),('CHILD-C1')
       ) v (child)
),
dat as (
  select * 
  from ( values 
        ('TOP'     , null ),
        ('PARENT-A','TOP' ),
        ('CHILD-A1','PARENT-A'),
        ('CHILD-A2','PARENT-A'),
        ('PARENT-B','TOP' ),
        ('CHILD-B1','PARENT-B'),
        ('PARENT-C','TOP'),
        ('CHILD-C1','PARENT-C')
       ) v(child,parent)
), 
rec as (
  select dat.* 
  from dat join param on dat.child=param.child
  union all 
  select dat.*
  from dat join rec on dat.child=rec.parent
)  
select distinct * from rec

http://sqlfiddle.com/#!6/9eecb/4021/0