Sql 分层查询的奇怪行为

Sql 分层查询的奇怪行为,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个分层查询,它多次返回同一行(按rowid): select rowid, regexp_substr(col, '[^; ]+', 1, level) data, level from (select * from table1 where rowid in ('rowid1', 'rowid2')) connect by regexp_substr(col, '[^; ]+', 1, level) is not null 此查询返回以下结果(摘录): 同

我有一个分层查询,它多次返回同一行(按rowid):

select 
    rowid, regexp_substr(col, '[^; ]+', 1, level) data, level
from 
    (select * from table1 where rowid in ('rowid1', 'rowid2'))
connect by 
    regexp_substr(col, '[^; ]+', 1, level) is not null
此查询返回以下结果(摘录):

同一行是它自己的父行和子行,这怎么可能发生呢

此外,如果我想通过rowid限制我想要的孩子:

connect by regexp_substr(col, '[^; ]+', 1, level) is not null and prior rowid = rowid

Oracle告诉我,我的数据中有一个循环?这似乎是合理的,因为我有一行的rowid与它自己的父级和子级相同,但在前一种情况下它是如何工作的(没有
和previor rowid=rowid
)?

如果
col
包含类似于
'val1;val2;val3;val4'
。然后,下一个级别仍将匹配同一行,因为您没有使用上一行的任何字段值,而只使用级别

SQL Fiddle证明了我的建议:

Oracle尝试检测循环,但仅在查询中使用
previor
关键字时检查循环。本页上也或多或少地描述了此fenomenon:在标题“无需事先连接”下:

无需事先通知即可连接

分层查询的一种非常流行的用法,由Vadim记录 Tropashko在其《SQL设计模式》一书中提到了生成行

SELECT 
   SYS_CONNECT_BY_PATH(DUMMY, '/') 
FROM 
   DUAL 
CONNECT BY 
   LEVEL<4;

SYS_CONNECT_BY_PATH(DUMMY,'/')
--------------------------------
/X
/X/X
/X/X/X
选择
系统连接路径(虚拟“/”)
从…起
二重的
通过连接

level您正在查询的原始数据是什么?这很好,但是为什么我在
connectby
子句中添加另一个条件时,查询失败,表明存在一个循环?是的,这是因为使用了
prior
关键字。这会触发Oracle检查循环。我已经更新了我的答案。是否可以在
connectby
中使用
previor
,但在
connectby
子句中按条件处理周期?是的,使用“NO_CYCLE”关键字。不过,这似乎主要是一种调试功能。然而,你可以使用它。更多信息:
nocycle
允许执行查询,但oracle不返回循环层次结构,所以我只得到一行:。有可能得到循环层次结构吗?
SELECT 
   SYS_CONNECT_BY_PATH(DUMMY, '/') 
FROM 
   DUAL 
CONNECT BY 
   LEVEL<4;

SYS_CONNECT_BY_PATH(DUMMY,'/')
--------------------------------
/X
/X/X
/X/X/X