database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 24083 게시물 읽기
No. 24083
쿼리문으로 사이클 검사가 가능할까요?
작성자
손사장(syspert)
작성일
2005-09-14 10:19ⓒ
2005-09-14 10:29ⓜ
조회수
1,677

오라클에서 쿼리문으로 사이클 검사가 가능할까요?

아래와 같은 데이터가 있다고 가정을 합시다.

No(레코드번호), START(시작점), END(완료점)

---------------
No START END
---------------
1 A B
2 B C
3 C D
4 D A
5 E F
6 F E
7 G H
8 H I

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

연결을 직접 표현하면 아래의 3가지가 됩니다.

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

1) A -> B -> C -> D -> A

2) E -> F -> E

3) G -> H -> I

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

1) 는 A로 시작해서 다시 A로 돌아가므로 사이클이 존재합니다.

2) 는 E로 시작해서 다시 E로 돌아가므로 사이클이 존재합니다.

3) 는 보시는 바와 같이 사이클이 없습니다. (정상)

 

이러한 부분을 오라클의 쿼리문으로 사이클을 체크할 수 있는 방법이 없을까요?

고수님들의 답변을 목이 빠져라 기다리겠습니다. ^_^

 

이 글에 대한 댓글이 총 7건 있습니다.

이미 오래전에 불가능으로 결론난....

무한 카테고리 의 변형이군요....   ^^;;;

이경환(babocom)님이 2005-09-14 11:09에 작성한 댓글입니다.

결국 알고리즘으로 들어가야 하나요? -_-;;;

손사장(syspert)님이 2005-09-14 11:29에 작성한 댓글입니다.

'사이클 검사' 라는 표현은 모호한 표현입니다.

정확한 결과셋을 명시해야죠.

원하시는 결과가 사이클의 갯수인가요?

아니면 존재하는 사이클을 아래와 같이 보여주길 원하시나요?

A -> B -> C -> D -> A

E -> F -> E

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-14 11:35에 작성한 댓글입니다.

오라클만 가능한....   connect by 가 있군요... 

이경환(babocom)님이 2005-09-14 11:51에 작성한 댓글입니다.

A -> B -> C -> D -> A
E -> F -> E

위와 같은 결과를 원하다면,

해당 테이블을 test, 각 칼럼명을 no1, start1, end1 이라고 할때,

 

SELECT   d.start1 || e.PATH
    FROM TEST d,
         (SELECT   MIN (c.no1) no1, MAX (c.PATH) PATH
              FROM (SELECT     LEVEL lvl, a.no1,
                               SYS_CONNECT_BY_PATH (a.end1, '->') PATH
                          FROM TEST a
                    CONNECT BY PRIOR DECODE ((SELECT 1
                                                FROM TEST b
                                               WHERE b.no1 < a.no1
                                                 AND b.start1 = a.end1),
                                             NULL, a.end1,
                                             ''
                                            ) = a.start1) c
          GROUP BY SUBSTR (c.PATH, 1, 3)
            HAVING LENGTH (MAX (c.PATH)) > 3) e
   WHERE d.no1 = e.no1 AND d.start1 = SUBSTR (e.PATH, -1)
ORDER BY d.no1

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-14 12:48에 작성한 댓글입니다.

 

장진주님의 SQL은

방향그래프를 탐색하는 순서와 NO의 순서가 일치한다는 조건하에서만 가능합니다.

 

예를 들어 위의 데이타에서 4 D A의 키가 4가 아니라 0 같은 것이라던가 하면 구할 수 없습니다.

 

만약 데이타의 가정이 장진주님 생각대로라면....

아주 훌륭한 사이클 검사 SQL이 됩니다...(번뜩이는 아이디어입니다.감탄!감탄!)

 

김흥수(protokhs)님이 2005-09-14 13:15에 작성한 댓글입니다.

헉 된다...

진짜 데이터로 제대로 테스트 해보고 다시 댓글 올리겠습니다.

감솨 합니다. ^---^

손사장(syspert)님이 2005-09-14 13:17에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
24086CallableStatement의 resultSet에 셋하는 시간이 너무 오래걸립니다.
거시기
2005-09-14
904
24085rman backup 질문입니다. [1]
오라클
2005-09-14
1466
24084order by 도와주서요 [4]
도와주서요
2005-09-14
2534
24083쿼리문으로 사이클 검사가 가능할까요? [7]
손사장
2005-09-14
1677
24082ODBC API 함수 [1]
이창헌
2005-09-14
1965
24081오라클, MS-SQL, MY-SQL의 특징과 차이점은 어떻게 되나요?? [4]
완전초보
2005-09-14
5592
24080모델링 [5]
초보디비
2005-09-13
1971
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다