如何找到导致 ORA-01436 的不正当数据

Suw*_*bar 1 sql oracle recursive-query hierarchical-data hierarchical-query

我有一个查询来查看父子层次数据列表。在运行下面的查询时,我得到了错误ORA-01436

SELECT ParentPropertyRSN, CONNECT_BY_ROOT PropertyRSN as PropertyRSN,
   LEVEL, SYS_CONNECT_BY_PATH(ParentPropertyRSN, '/') Path
FROM Property
   CONNECT BY PRIOR PropertyRSN = ParentPropertyRSN
   order by level desc;
Run Code Online (Sandbox Code Playgroud)

所以我NOCYCLECONNECT BY子句中添加并获得了完整的数据列表及其分层路径

现在我需要的是一个查询来获取包含不准确数据的行列表ORA-01436

GMB*_*GMB 5

您确实应该使用NOCYCLE来避免无限循环。最重要的是,您可以使用CONNECT_BY_ISCYCLE来识别违规行:

SELECT 
    ParentPropertyRSN, 
    CONNECT_BY_ROOT PropertyRSN as PropertyRSN,
    LEVEL, 
    SYS_CONNECT_BY_PATH(ParentPropertyRSN, '/') Path,
    CONNECT_BY_ISCYCLE Has_Cycle
FROM Property
CONNECT BY NOCYCLE PRIOR PropertyRSN = ParentPropertyRSN
ORDER BY level desc;
Run Code Online (Sandbox Code Playgroud)

文档

CONNECT_BY_ISCYCLE虚列返回1如果当前行有一个孩子,这也是它的祖先。否则返回0

CONNECT_BY_ISCYCLE仅当您指定NOCYCLECONNECT BY子句的参数时才能指定。NOCYCLE使 Oracle 能够返回查询的结果,否则会因CONNECT BY数据中的循环而失败。

  • @SuwaidAkbar:那么您可以将此查询转换为子查询,然后在外部查询中过滤“HasCycle”。 (2认同)