【问题标题】:Oracle "start with" bottom to top recursion SQL Server equivalentOracle“开始于”自下而上递归 SQL Server 等效
【发布时间】:2015-06-21 19:47:01
【问题描述】:

我看过很多帖子,这些帖子涉及如何将 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

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

【问题讨论】:

    标签: sql-server oracle recursion common-table-expression connect-by


    【解决方案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

    【讨论】:

    • 我不需要对值进行排序。我将您的最后一条语句更改为从rec 中选择不同的孩子。这正是我需要的谢谢!
    猜你喜欢
    • 2015-05-21
    • 2011-05-01
    • 2014-05-30
    • 1970-01-01
    • 2011-09-04
    • 2021-10-26
    • 2021-11-18
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多