2011-04-18 77 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。所以這就是爲什麼我建議使用一個遊標,所以我可以重複使用上面的語句,只需使用一個變量而不是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

+0

是是是是是!這是遞歸查詢的第一天,我還沒有進入它們。非常感謝,這解決了我的問題! – LaBracca 2011-04-18 14:08:54