यदि यह अज्ञात है तो पदानुक्रम में कितने स्तर हैं?
फिर ऐसी चुनौती अक्सर एक पुनरावर्ती सीटीई के माध्यम से की जाती है।
उदाहरण स्निपेट:
--
-- Using table variables for testing reasons
--
declare @customertest table (cid int primary key, upid int);
declare @conftest table (cid int, confname varchar(6) default 'budget', confvalue int);
--
-- Sample data
--
insert into @customertest (cid, upid) values
(1,0), (2,1), (3,1), (4,2), (5,2), (6,3),
(7,5), (8,5), (9,8), (10,9);
insert into @conftest (cid, confvalue) values
(1,1000), (2,700), (3,300), (4,100), (5,200), (6,300);
-- The customer that has his own budget, or not.
declare @customerID int = 10;
;with RCTE AS
(
--
-- the recursive CTE starts from here. The seed records, as one could call it.
--
select cup.cid as orig_cid, 0 as lvl, cup.cid, cup.upid, budget.confvalue
from @customertest as cup
left join @conftest budget on (budget.cid = cup.cid and budget.confname = 'budget')
where cup.cid = @customerID -- This is where we limit on the customer
union all
--
-- This is where the Recursive CTE loops till it finds nothing new
--
select RCTE.orig_cid, RCTE.lvl+1, cup.cid, cup.upid, budget.confvalue
from RCTE
join @customertest as cup on (cup.cid = RCTE.upid)
outer apply (select b.confvalue from @conftest b where b.cid = cup.cid and b.confname = 'budget') as budget
where RCTE.confvalue is null -- Loop till a budget is found
)
select
orig_cid as cid,
confvalue
from RCTE
where confvalue is not null;
परिणाम:
cid confvalue
--- ---------
10 200
बीटीडब्ल्यू, रिकर्सिव सीटीई बाहरी आवेदन का उपयोग करता है क्योंकि एमएस एसक्यूएल सर्वर बाएं बाहरी जॉइन का उपयोग करने की अनुमति नहीं देता है।
और अगर यह निश्चित है कि बजट के साथ upid के लिए अधिकतम 1 स्तर की गहराई है?
तब बस साधारण बायां जुड़ता है और एक कोलेस होता है।
उदाहरण के लिए:
select cup.cid, coalesce(cBudget.confvalue, upBudget.confvalue) as confvalue
from @customertest as cup
left join @conftest cBudget on (cBudget.cid = cup.cid and cBudget.confname = 'budget')
left join @conftest upBudget on (upBudget.cid = cup.upid and upBudget.confname = 'budget')
where cup.cid = 8;