Sql 分层查询的奇怪行为
我有一个分层查询,它多次返回同一行(按rowid):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 此查询返回以下结果(摘录): 同
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