2013-12-20 2 views
1

connect by 쿼리에서 매우 기본적인 쿼리를 작성하려고합니다. 하지만 어쨌든 중요한 부분이 하나 빠져 있습니다. 각 "소스"ID에 대해 궁극적 인 "대상"ID가 무엇인지 알고 싶습니다. 쿼리의중간 경로가 아닌 궁극적 인 대상을 얻기위한 재귀 적 오라클 쿼리

src trg 
1 2 
2 3 
3 4 
7 8 

current incarnation (SQL Fiddle)가 원하는 값을 반환합니다 :

select src, connect_by_root trg ult_trg 
from t 
connect by nocycle prior src = trg 
order by ult_trg, src; 

문제는 그게 반환 원하지 않는 값이다 예를 들어,이 소스 데이터가 있습니다. 원하는 결과는 다음과 같습니다.

1, 4 
2, 4 
3, 4 
7, 8 

결과 집합을 원하는 행으로 제한해야하는 이유는 무엇입니까?

답변

1
select 
    connect_by_root src as src, 
    trg ult_trg 
from t 
where 
    connect_by_isleaf = 1 
    connect by nocycle src = prior trg 
order by ult_trg, src 
+0

나는 그의 첫 번째와 옳은 것이기 때문에 @ pm-77-1을 수락했다. 그러나이 아이디어는 정확하고 매우 흥미 롭습니다. 그것은 내가했던 방식에서 거꾸로 (PRIOR src 대신에 pre trg) 일종의 것입니다. 중첩 된 쿼리가 필요하지 않습니다. 메인 쿼리에서'WHERE CONNECT_BY_ISLEAF = 1'만으로 답이 깔끔해질 것입니다. – mdahlman

+0

네 말이 맞아! 나는 그것을 편집했다. .. 고마워! –

+0

좋은 답변입니다. 나는 들여 쓰기를 조금 바꿔 편집했다. 감사! – mdahlman

1
select src, MAX(connect_by_root trg) ult_trg 
from t 
connect by nocycle prior src = trg 
GROUP BY src 
order by ult_trg, src; 

Fiddle

+0

이, 번호 작동을 수정하지만, 실시간으로, 그것은 궁극적 인 경로를 가져 오지 않는다? 그리고 텍스트를 위해 일하지 않을 것이다! –

+0

죄송합니다. @MaheswaranRavisankar에 대한 허용 된 대답을 옮겼습니다. 샘플 데이터에 대한 귀하의 답변이 좋았습니다. 그러나 좀 더 일반적인 경우에는 ID가 반드시 증가하지는 않습니다. 그래서'MAX()'는 모든 경우에 원하는 값을 반환하지 않습니다. – mdahlman

+0

@mdahlman 문제는 없습니다. 네가 옳아. –