CONNECT BY仅允许一个循环

时间:2017-02-22 22:47:22

标签: sql oracle connect-by

我们说我有下表

  Row_ID | SourceId | TargetId
---------|----------|----------
    1    |    1     |    2
    2    |    2     |    3
    3    |    2     |    4
    4    |    4     |    5
    5    |    5     |    6
    6    |    6     |    5

我必须在查询中包含所有这些行,因为它们都已连接。 但是,当我这样做时:

SELECT Row_ID
FROM   MyTable
START WITH SourceId = 1
CONNECT BY NOCYCLE PRIOR TargetId = SourceId

它不会使Row_ID等于6的行。

我认为这是因为NOCYCLE关键字。但是如果我把它取下来,那么查询就不起作用,因为那里有一个循环。

我想设置一个可以带给我一切的查询。你们有什么想法吗?

2 个答案:

答案 0 :(得分:3)

根据CONNECT BY子句中包含的列中的值检测周期,具体而言,仅检查那些受PRIOR运算符限制的列。

在你的例子中,尽管看起来这个附加条件(下面)应该没有效果,但确实如此。试试吧,你会看到。添加

and PRIOR Row_ID IS NOT NULL

当然,没有Row_ID永远为空,所以这不会改变逻辑;但现在Row_ID的值被添加到确定循环是否存在时考虑的值中,因此您将能够获得所有行。

(注意 - 我刚刚编辑了将RowID更改为Row_ID的答案,以避免与Oracle保留字冲突。)

答案 1 :(得分:0)

那会有效。但是,你并不真正需要一个CONNECT BY用于你想要的东西,而不是它有什么问题。

以下是不使用CONNECT BY

的替代版本
select *
  from test et 
 where exists(select 1
                from test it
               where et.targetId = it.sourceId OR it.targetId = et.sourceId)
 order by row_id;

通过确定哪些行指向彼此,它几乎应用了同样的想法