【问题标题】:Hierarchical query outputs error分层查询输出错误
【发布时间】:2015-09-17 10:49:05
【问题描述】:

这是我的代码:

  with tbl as
  (
    Select parent_b.BRANCH_ID, parent_b.BRANCH_CODE,
           parent_b.BRANCH, parent_b.PARENT_BRANCH_ID
    from table parent_b
    Where parent_b.branch_Id = 1
    UNION ALL
    Select child_b.BRANCH_ID, child_b.BRANCH_CODE,
           child_b.BRANCH, child_b.PARENT_BRANCH_ID
    from table child_b 
    INNER JOIN tbl parent
        ON parent.branch_id = child_b.branch_id
  )
  select * from tbl
 OPTION(MAXRECURSION 32767)

上面的代码让我收到这条消息的错误:

语句终止。最大递归100已用完 在语句完成之前。

我检查了表格,没有行指向自己的行(无穷大)。

我的问题在哪里?

【问题讨论】:

  • 我认为错误很明显。要么您的编码存在逻辑缺陷,要么您需要MAXRECURSION 选项(请参阅msdn.microsoft.com/en-us/library/ms175972.aspx)。
  • @GordonLinoff,我试过了,但没有成功。我编辑了我的问题。

标签: sql sql-server


【解决方案1】:

CTE 的递归部分存在逻辑错误 - 连接条件:

ON parent.branch_id = child_b.branch_id

正在将父母的branch_id 直接链接到孩子的branch_id,而它应该链接到孩子的parent_branch_id - 就像这样:

ON parent.branch_id = child_b.parent_branch_id

以下查询应该有效:

 with tbl as
  (
    Select parent_b.BRANCH_ID, parent_b.BRANCH_CODE,
           parent_b.BRANCH, parent_b.PARENT_BRANCH_ID
    from table parent_b
    Where parent_b.branch_Id = 1
    UNION ALL
    Select child_b.BRANCH_ID, child_b.BRANCH_CODE,
           child_b.BRANCH, child_b.PARENT_BRANCH_ID
    from table child_b 
    INNER JOIN tbl parent
        ON parent.branch_id = child_b.parent_branch_id
  )
  select * from tbl
 OPTION(MAXRECURSION 32767)

【讨论】:

    【解决方案2】:

    在查询结束时指定 maxrecursion 选项:

     select *
    from tbl
    option (maxrecursion 0)
    

    【讨论】:

    • 您的查询不是输出我error message,但您的查询仅输出带有branch_Id = 1 的元素。
    • @ШыназАлиш 请检查您的查询和数据。您可以指定数据示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多