2017-02-22 4 views
0

이의 내가 다음 표CONNECT BY - ORACLE - 하나의 cicle

RowId | SourceId | TargetId 
---------|----------|---------- 
    1 | 1  | 2 
    2 | 2  | 3 
    3 | 2  | 4 
    4 | 4  | 5 
    5 | 5  | 6 
    6 | 6  | 5 

나는 그들이 모두 연결되어 있기 때문에 내 쿼리에서 이러한 행을 모두 가지고있다가 있다고 가정 해 봅시다 가능. 내가 할 때 그러나,이 : 나는 그것을 때문에 NOCYCLE 키워드의 생각

6에 그것의 RowId로 행을 가져 오지 않습니다

SELECT RowId 
FROM MyTable 
START WITH SourceId = 1 
CONNECT BY NOCYCLE PRIOR TargetId = SourceId 

같음. 그러나 내가 그것을 없애면 거기에 시클릿이 있기 때문에 쿼리가 작동하지 않습니다.

나는 모든 것을 가져다 줄 쿼리를 설정하고 싶었습니다. 너희들 생각 나니?

+1

는'RowID' - 좋지 않다, 그것은 그것을'Row_ID'을 ... 예약어입니다. – mathguy

답변

3

사이클 가리 운동이 동일한 생각을 적용 CONNECT BY

select * 
    from test et 
where exists(select 1 
       from test it 
       where et.targetId = it.sourceId OR it.targetId = et.sourceId) 
order by row_id; 

를 사용하지 않고 대안적인 버전 인 CONNECT BY 절에서, 특히 PRIOR 연산자의 대상인 C 럼에만 해당됩니다.

예를 들어,이 추가 조건 (아래)이 효과가 없어 보이는 것처럼 보일지라도 귀하의 예에서는 그렇습니다. 그냥 시도해 보면 알 수 있습니다. 더 Row_ID 이제까지 널 (null)입니다, 물론

and PRIOR Row_ID IS NOT NULL 

추가, 그래서 이것은 로직을 변경하지 않습니다; 그러나 지금은 Row_ID의 값이주기가 존재하는지 판단 할 때 고려되는 값에 추가되어 모든 행을 가져올 수 있습니다.

(참고 - 난 그냥 오라클과 충돌을 피하기 위해 Row_ID-RowID을 변경하는 내 대답을 편집 한 단어를 소유.)

+0

사실, 잘 말했습니다. 고맙습니다! –

3

방금 ​​해결책을 찾았습니다.

SELECT myRowId 
FROM myTable 
START WITH SourceId = 1 
CONNECT BY NOCYCLE PRIOR TargetId = SourceId or TargetId = PRIOR SourceId 

당신과 모두 공유. 감사.

+0

나는 동의하지 않는다. 이 방법이 효과가있는 것은 아니지만 "올바른"대답은 아닙니다. (물론 - 방금 다른 것을주었습니다. 올바른 것이라고 믿습니다!) – mathguy

0

그게 효과가 있습니다. 그러나 당신이 원하는 것을 위해 CONNECT BY가 실제로 필요하지는 않습니다. 여기

그것은 거의 행에 포함되는 항목 값에 기초하여 검출되고 서로

+0

어떻게 재귀를하고'start with' 부분을합니까? (질문은 하나의 관련 데이터 그룹 만 보여 주지만 전체 테이블이라면 'myrowid에서 myrowid 선택'으로 충분합니다 ...) –

+0

정확히 하나의 관련 데이터 그룹을 표시합니다 –

+0

어쩌면 내가 오해했을 수도 있지만 내가 얻은 방법은 서로 관련있는 모든 레코드를 그의 테이블에 나열하고 싶었던 것입니다. 예 : 거기에 sourceId = 99이고 targetId = 100 인 레코드가 있다면 그것은 선택되지 않았을 것입니다. 내 잘못은 그가 원한 것이 아니지만 이것이 나의 해석 ' 모두가 연결되어 있기 때문에이 모든 행을 내 쿼리에 가져와야합니다.'라고 대답했습니다. – Julian