재귀

2013-10-21 3 views
1

나는 (현재) 7 개 테이블 세트를, 같은 이름의 실행 수와 동일한 구조를 가진 모든이 있습니다 tbl_1_items, tbl_2_items, tbl_3_items ...재귀

각 테이블 key, parentKey, url, other columns ... 물론 table1에는 parentKey가 포함되어 있지 않습니다.

재귀 쿼리/SP가 필요하다면 특정 레벨에서 실행하고 키가 내려가 null이 아닌 URL을 찾을 때까지 반복적으로 쿼리를 수행해야합니다. 그러면 첫 번째 결과 만 실행합니다.

예 : 결과가없는 경우

SELECT url FROM 'tbl_' + @level + 'items' WHERE url IS NOT NULL 

지금은

SELECT url FROM 'tbl_' + (@level + 1) + 'items' WHERE url IS NOT NULL 

요법을 할 것입니다 : 내가 2 키 1 그래서이 작업을 수행 할 수준 보냅니다. 마지막 수준까지.

할 수 있습니까?

PLZ 내가 명확하지 충분히 오전 있으면 알려 주시기

+0

우, 즉 구역질 *입니다 * 때문에 동적 스키마의 (즉 테이블 이름이 수준을 인코딩). 일반적으로 CTE (명령 테이블 표현식)는 재귀에 유용하지만 동적 스키마는 EXEC/sp_executesql 등을 사용해야합니다. CTE에서 허용되는지 여부는 확실하지 않습니다. 스키마를 업데이트 할 수 있다고 말하십니까 ?? 스키마 *를 변경할 수없는 경우 모든 테이블을 평평하게 만드는 * 뷰 *를 만들 것을 고려하십시오 (모든 테이블 이름과 7 개의 테이블에 대해 필요한 조인을 하드 코드로 처리하는 것이 더 쉽습니다) (즉, 자기 재귀적인 부모 - 자식 관계/tabke). – user2864740

+0

와우, CTE = 공통 테이블 식과 재귀를 처리하는 CTE는 재귀 CTE입니다. – user2864740

+0

내가보기에, 각각의 새로운 레벨에 대해 새로운 테이블을 생성하는 대신 자체 참조 테이블을 생성하는 것이 더 좋지 않을까요? 모든 것이 더 쉽게 관리 될 것입니다. – Raphael

답변

0
select top 1 * 
from 
(
    select 1 as level, url from tbl_1_items where url IS NOT NULL 
    union 
    select 2 as level, url from tbl_2_items where url IS NOT NULL 
    union 
    select 3 as level, url from tbl_3_items where url IS NOT NULL 
    union 
    select 4 as level, url from tbl_4_items where url IS NOT NULL 
    union ... 
) v 
order by level