【问题标题】:How to find the imporper data that cause ORA-01436如何找到导致 ORA-01436 的不正确数据
【发布时间】:2020-06-11 14:06:42
【问题描述】:

我有一个查询来查看父子数据分层列表。在运行以下查询时,我收到错误 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;

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

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

【问题讨论】:

  • 请发布一些测试数据,作为文本没有图像,以及预期的结果。在这种情况下,包括给出错误的数据和一些不给出错误的数据(如果可能的话)。进一步指出预期结果并指出那些给出错误的结果。您可能还想查看How to Ask

标签: sql oracle hierarchical-data recursive-query hierarchical-query


【解决方案1】:

您确实应该使用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;

来自the documentation

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

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

【讨论】:

  • 我得到了结果,但是如果我只想看到有问题的行该怎么办
  • @SuwaidAkbar:你可以把这个查询变成一个子查询,然后在外部查询中过滤HasCycle
猜你喜欢
  • 2012-04-05
  • 1970-01-01
  • 2019-04-04
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多