idx || kind || code || date
----------------------------------------
1 || 1 || root || 2007.10.30
2 || 1 || 01 || 2007.10.30
3 || 1 || 0101 || 2007.10.30
4 || 1 || 010101 || 2007.10.30
5 || 1 || 0102 || 2007.10.30
6 || 1 || 02 || 2007.10.30
7 || 1 || 03 || 2007.10.30
8 || 1 || 0301 || 2007.10.30
9 || 1 || 030101 || 2007.10.30
10 || 1 || 030201 || 2007.10.30
11 || 1 || 030202 || 2007.10.30
12 || 1 || 030203 || 2007.10.30
13 || 1 || 04 || 2007.10.30
14 || 1 || 0401 || 2007.10.30
15 || 1 || 0402 || 2007.10.30
16 || 1 || 0403 || 2007.10.30
.
.
.
2만번째값 ......
트리의 depth(level) : ## 형태로 3level 입니다. leaf를 표시 해줄 flag는 없습니다. 검색하여 가져와야 합니다. (데이터수가 많아서 풀스캔을 할경우 오래 걸린다는걸 생각해야합니다.)
트리 형태의 테이블이 있습니다. 트리에서 leaf만(마지막번째) 가져오고 싶습니다. (예를 들면 01을 보면 01밑에 0101이 있고 그 밑에 010101이 있고 그밑에는 더 내려가는 값이
없으므로 010101이 leaf(마지막번째) 값이 겠지요)
결과값
idx || kind || code || date
----------------------------------------
1 || 1 || root || 2007.10.30
2 || 1 || 010101 || 2007.10.30
3 || 1 || 0102 || 2007.10.30
4 || 1 || 02 || 2007.10.30
5 || 1 || 030101 || 2007.10.30
6 || 1 || 030201 || 2007.10.30
7 || 1 || 030202 || 2007.10.30
8 || 1 || 030203 || 2007.10.30
9 || 1 || 0401 || 2007.10.30
10 || 1 || 0402 || 2007.10.30
11 || 1 || 0403 || 2007.10.30
.
.
.
1만8천여건.....
이런 형태의 값을 뽑고 싶습니다. (leaf code를 뽑아 오고 싶은 거지요.)
데이터가 적은줄 알고 만들었던 퀘리 입니다. (위에선 idx, kid, date까지 보여줬지만 그건 나중에 포함시키도 되는거라서 뺐습니다. code가 정확하게 나오고 속도가 빠르게
나오는 방법을 생각중인데 머리만 잡고 끙끙 거리고 있네요 ㅠㅠ)
select cc.code
from (
select code
from table
where len(code) = 6 --leaf 번째 값
and kid = 1
and code <> 'root'
union all
select code
from (
select code
from table
where len(code) <> 6
and kid = 1
and code <> 'root'
) as aa
, table as bb
where bb.code like aa.code+'%'
and bb.kid = 1
and bb.code <> 'root'
) as cc
(데이터가 적을 경우 이방법으로 하면 금방 구할수 있습니다. 하지만 데이터가 2만, 3만건이 될경우 상당한 시간이 소요됩니다. index는 물론 걸려있습니다.(code)
테이블 전체에서 검색을 해서 그렇겠지요)
다른 방법을 생각해 보라고 하는 데 flag는 안썼으면 하시고, 속도와 값이 정확하게 나오게 하라고 하시는데 참 난감하네요.
고수님들 저에게 새로운 눈을 뜰수 있도록(서광) 가르쳐 주십시오... 부탁드립니다.~~~ |