我们说我有下表
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
关键字。但是如果我把它取下来,那么查询就不起作用,因为那里有一个循环。
我想设置一个可以带给我一切的查询。你们有什么想法吗?
答案 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;
通过确定哪些行指向彼此,它几乎应用了同样的想法