【问题标题】:"OR" operator in CONNECT BY PRIORCONNECT BY PRIOR 中的“或”运算符
【发布时间】:2018-08-20 18:11:50
【问题描述】:

数据库中的行是:

DATAID OWNERID PARENTID
111    123     133
976    346     111
987    976     657

我想显示所有这些行,但使用以下查询仅显示前 2 行,我需要所有 3 行:

SELECT * FROM DTREE  start with DATAID=111
connect by prior dataid=parentid OR dataid=ownerid;

它似乎只运行dataid=parentid 部分而不是第二个部分。

【问题讨论】:

  • DATAID987 未通过父 ID 或所有者 ID 连接到任何其他行。您期望这里的输出是什么?
  • DATAID的值应该算976吧?之后因为第 3 行的 ownerid 是 976(dataid=ownerid) 因此它应该被显示?
  • only the top 2 rows are getting displayed ...这是我所期望的。
  • 如何修改查询以获得第三行?
  • 第三行不属于输出。

标签: sql oracle connect-by


【解决方案1】:

您缺少应用于第二次出现的 DATAID 的 PRIOR 运算符:

SELECT * FROM DTREE  start with DATAID=111
connect by prior dataid=parentid OR   prior  /* <-- MISSING!!! */  dataid=ownerid;

或者:

connect by prior dataid in (parented, ownerid);

【讨论】:

    【解决方案2】:

    为了防止循环,你应该使用 NOCYCLE 子句

    SELECT * FROM DTREE  start with DATAID=111
    connect by prior nocycle dataid=parentid OR prior dataid=ownerid;
    

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2013-10-24
      • 2019-10-07
      相关资源
      最近更新 更多