2011-12-27 3 views
4

나는 지역 및 하위 영역의 계층 구조 테이블을 가지고 있으며 쉽게 영역과 하위 영역의 트리를 나열해야하지만 또한 각 영역에 대해 하위 영역의 모든 ID를 표시하는 열이 필요합니다. 예를 들어범주/하위 범주 트리 나열 및 하위 열을 같은 행에 표시

는 : 뭔가처럼

id name  superiorId 
------------------------------- 
1  RJ   NULL   
2  Tijuca  1   
3  Leblon  1   
4  Gavea  2   
5  Humaita  2   
6  Barra  4 

나는 것으로 결과가 필요 내가했던

id  name  superiorId sub-regions 
----------------------------------------- 
1  RJ   NULL  2,3,4,5,6 
2  Tijuca  1   4,5,6 
3  Leblon  1   null 
4  Gavea  2   4 
5  Humaita  2   null 
6  Barra  4   null 

그, 을 지역 행의 다도()를 검색하는 기능을 생성하여 예를 들어 한 국가에서 모든 지역을 선택하는 경우 각 지역의 지역 아들을 가져 오는 함수를 실행하기 때문에 쿼리가 실제로 느리게됩니다.

누구나 최적화 된 방법으로이를 얻는 방법을 알고 있습니까?

"행으로 모든 ID를 검색"이라는 기능 :

내가 함수가 쉼표로 구분 된 문자열로 모든 하위 지역의 ID를 반환 것을 의미했다. 기능은 다음과 같습니다

CREATE FUNCTION getSubRegions (@RegionId int) 
RETURNS TABLE 
AS 
RETURN(
select stuff((SELECT CAST(wine_reg.wine_reg_id as varchar)+',' 
from (select wine_reg_id 
      , wine_reg_name 
      , wine_region_superior 
     from wine_region as t1 
     where wine_region_superior = @RegionId 
     or exists 
       (select * 
       from wine_region as t2 
        where wine_reg_id = t1.wine_region_superior 
         and (
          wine_region_superior = @RegionId 

          ) 
      )) wine_reg 
ORDER BY wine_reg.wine_reg_name ASC for XML path('')),1,0,'')as Sons) 
GO 
+0

이것은 의미가 없습니다. 두 번째 "RJ"가 "TJ"인가? 샘플 출력의 "RJ"에 2에서 6까지의 하위 영역이 있지만 "RJ"까지 연결되는 7, 8 및 9는 포함되지 않는 이유는 무엇입니까? 데이터를 정리하면 도움이 될 수도 있습니다. – mwigdahl

+2

죄송합니다. 편집 할 때 엉망이되었습니다. 고정되어 있습니다 ... –

답변

2

우리가 데이터베이스에이 연결된 목록을 만드는 데 사용하는 경우 우리는 유사한 접근 방식을했다 우리가 속도를 보았을 때 당신이 먼저

에서 일을

we made them into CLR functions 
http://msdn.microsoft.com/en-US/library/a8s4s5dz(v=VS.90).aspx 

지금 우리의 데이터베이스는 데이터의 저장 및 검색을 책임집니다.

this sort of thing will be in our data layer in the application 
+0

응용 프로그램 계층에서도 빠른 방법으로 그렇게 할 수있는 방법을 찾지 못했습니다. 원하는 것은 처리하는 데 시간이 걸리는 것입니다. 그 정보를 가지고 json 객체를 직렬화 할 것이므로 그 컬럼을 가지고 있으면 좋을 것입니다. –

+0

CLR 기능을 만들려고 했습니까? 귀하의 도메인에 어떤 프로그래밍 언어가 사용되고 있습니까? –

+1

CRL 기능이란 무엇입니까? 나는 각 영역에 대한 모든 subRegions를 반환하는 위의 getSubRegions()를 만들었습니다. Coldfusion에서 프로그래밍 중입니다. 응용 프로그램은 쿼리를 호출하고 결과를 처리하여 필요한 JSON 파일을 작성합니다. 하지만 Java를 사용할 수도 있습니다. –

관련 문제