0

我看过很多帖子,这些帖子涉及如何将 Oracle“先连接”语句转换为 SQL Server 公用表表达式。但是,我有一个 Oracle“先连接”语句,上面有一个“以 ('value1','value2','value3') 中的字段名开头”子句,我没有看到任何关于如何将此转换为 SQL Server。我相信这被认为是“自下而上”的递归。

这是我的 Oracle 查询:

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

样品表:

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

我的查询应该如下工作:

  • 将包括 CHILD-A1 及其父母:TOP、PARENT-A、CHILD-A1
  • 将包括 CHILD-C1 及其父母:TOP、PARENT-C、CHILD-C1
  • CHILD-A2 将被排除在外,因为 CHILD-A2 不在我的列表中。PARENT-A 将被包括在内,因为 CHILD-A1 在我的列表中。
  • PARENT-B 和 CHILD-B1 将被排除在外,因为 CHILD-B1 不在我的列表中。
  • 最终的不同结果集将是 TOP、PARENT-A、CHILD-A1、PARENT-C、CHILD-C1

我希望我已经很好地解释了这一点。今天我一直在寻找适合这个的例子。任何投入将不胜感激。

4

1 回答 1

1

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

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

于 2015-04-15T18:31:54.713 回答