Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

Connect_By_Iscyle Inconsistent?

Frank KulashDec 15 2016 — edited Dec 16 2016

Hi,

I don't understand exactly how CONNECT_BY_ISCYCLE and CONNECT BY NOCYCLE work.

When I run this query:

WITH    data    AS

(          SELECT  'Rock' AS parent, 'Scissors' AS child  FROM dual

UNION ALL  SELECT  'Paper',          'Rock'               FROM dual

UNION ALL  SELECT  'Scissors',       'Paper'              FROM dual

UNION ALL  SELECT  'Dynamite',       'Rock'               FROM dual

)

SELECT  SYS_CONNECT_BY_PATH (parent, '/')  AS path

,       CONNECT_BY_ISCYCLE                 AS iscycle

FROM    data

START WITH          parent  IN ('Rock', 'Dynamite')

CONNECT BY NOCYCLE  parent  = PRIOR child

;

I get these results:

PATH                                ISCYCLE

----------------------------------- -------

/Dynamite                                 0

/Dynamite/Rock                            0

/Dynamite/Rock/Scissors                   1

/Rock                                     0

/Rock/Scissors                            0

/Rock/Scissors/Paper                      1

The rows starting with 'Rock' are exactly what I expect, but for the rows starting from 'Dynamite', I expected these results:

PATH                                ISCYCLE

----------------------------------- -------

/Dynamite                                 0

/Dynamite/Rock                            0

/Dynamite/Rock/Scissors                  0

/Dynamite/Rock/Scissors/Paper             1

I don't see why a cycle is detected at 'Scissors' when I start from 'Dynamite', but not when I start from 'Rock'.

The SQL Language manual ( https://docs.oracle.com/database/121/SQLRF/pseudocolumns001.htm#SQLRF50939  ) says "The CONNECT_BY_ISCYCLE pseudocolumn returns 1 if the current row has a child which is also its ancestor. Otherwise it returns 0."  In the case of "/Dynamite/Rock/Scissors ", the only child of 'Scissors' is 'Paper', but the only ancestors (so far) are 'Dynamite' and 'Rock'.

Why do I get all the rows in the loop when I start from within the loop, but not when I start from outside the loop?

Is there a work-around, so I can get the '/Dynamite/Rock/Scissors/Paper' row included in the output?

I'm using Oracle 12.1.0.2.0, and I get the same results in 10.2.0.1.0.

This problem came up in another thread: Hierarchy query help

This post has been answered by James Su on Dec 15 2016
Jump to Answer

Comments

Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Jan 13 2017
Added on Dec 15 2016
16 comments
1,639 views