2011-04-18 4 views
4

재귀 쿼리를 여러 번 호출하는 쿼리를 작성해야합니다.재귀 쿼리를 하위 쿼리로 사용하는 방법?

나는 어떻게하는지 알 수 없었다. 나는 커서를 사용하여 런타임시 SQL 문을 준비한 다음 EXEC (mySQLstatement)를 사용하여 모든 커서 FETCH NEXT에서이를 실행하여이 작업을 수행 할 수 있다고 생각합니다.

어쨌든 이것은 좋은 접근 방법이 아닙니다.

이것은 문제가됩니다. 물론 간단합니다. 나는 자신을 표현하는 데 필요한 열만 남겨 둡니다. 고객 트리 (계층 구조)가 있으며 모든 고객에 대해 정의 된 연락처가 있습니다.

CUSTOMERS 테이블에는 ID_CUSTOMER 필드와 ID_PARENT_CUSTOMER 필드가 포함되어 있습니다. CUSTOMER_CONTACTS 테이블에는 ID_CUSTOMER 필드와 ID_CONTACT 필드가 있습니다. 이 쿼리 (작동) 전 고객 (308)에 대한 모든 연락처 및 하위 고객의 모든 연락처를 얻을 수 있어요와

:

with [CTE] as (
    select ID_CUSTOMER from CUSTOMERS c where c.ID_CUSTOMER = 308 
    union all 
    select c.ID_CUSTOMER from [CTE] p, CUSTOMERS c 
     where c.ID_PARENT_CUSTOMER = p.ID_CUSTOMER 
) 
select ID_CUSTOMER into #Customer308AndSubCustomers from [CTE] 

select 308 as ParentCustomer, ID_CUSTOMER, ID_CONTACT, from CUSTOMER_CONTACTS 
WHERE ID_CUSTOMER IN (select * from #Customer308AndSubCustomers) 
drop table #Customer308AndSubCustomers 

하지만 단일 쿼리에하고 싶은를 위의 구문을 재사용하여 308 대신 변수를 사용할 수 있도록 커서를 사용하는 것이 좋습니다.

그러나 더 나은 쿼리를 제안 할 수 있습니까?

답변

6

그냥 앵커 부분에서 필터링 조건을 제거 :

WITH q AS 
     (
     SELECT ID_CUSTOMER, ID_CUSTOMER AS root_customer 
     FROM CUSTOMERS c 
     UNION ALL 
     SELECT c.ID_CUSTOMER, q.root_customer 
     FROM q 
     JOIN CUSTOMERS c 
     ON  c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER 
     ) 
SELECT * 
FROM q 

root_customer 당신에게 체인의 루트를 표시합니다.

동일한 고객이 여러 번 반환 될 수 있습니다.

할아버지는 조부모님의 나무와 그 부모 나무 그리고 그 자신의 나무에서, 그러나 매번 다른 root_customer과 함께 3 배 이상을 돌려 주겠다고 말합니다.

+0

예 예 예 예 예! 재귀 쿼리를 사용하는 첫 번째 날입니다. 아직 그 중 일부는 아닙니다. 고마워, 내 문제를 해결! – LaBracca

관련 문제