2012-08-24 15 views
9

एसक्यूएल सर्वरटीएसक्यूएल - जबकि लूप का चयन करें?

ठीक है, इसलिए मैं डेटाबेस तालिका के साथ काम कर रहा हूं जिसमें पंक्तियों में माता-पिता पंक्तियां हो सकती हैं, जिसके बाद माता-पिता की पंक्तियां हो सकती हैं। मुझे रूट 'पंक्ति' का चयन करने की आवश्यकता है। मुझे ऐसा करने का सबसे अच्छा तरीका नहीं पता।

पेरेंट आईडी नामक एक फ़ील्ड है, जो उस आईडी के साथ पंक्ति में पंक्ति को जोड़ता है। जब ParentId = 0, यह मूल पंक्ति है।

SELECT Releases.Name,WorkLog.WorkLogId 

FROM WorkLog,Releases 
WHERE 
Releases.ReleaseId = WorkLog.ReleaseId 
and WorkLogDateTime >= @StartDate 
and WorkLogDateTime <= @end 

मैं वास्तव में, बच्चे विज्ञप्ति के रिलीज नाम की जरूरत नहीं है मैं केवल रूट रिलीज नाम चाहते हैं, तो मैं के परिणाम का चयन करना चाहते:

यह अब मेरी क्वेरी है इस तरह एक ओर जहां पाश:

WHILE (ParentReleaseId != 0) 
BEGIN 
@ReleaseId = ParentReleaseId 
END 

Select Release.Name 
where Release.RealeaseId = @ReleaseId 

मुझे पता है कि वाक्य रचना भयानक है, लेकिन उम्मीद है कि मैं तुम्हें मैं क्या हासिल करने के लिए कोशिश कर रहा हूँ की एक विचार दे रहा हूँ।

इस क्वेरी एक पेड़ की एक कम तत्व हो रही है, और माता पिता के माता पिता के लिए ऊपर खोज:

+1

तो मैं वहाँ ParentReleaseId' बराबर शून्य 'साथ एक से अधिक रिहाई है अनुमान लगा रहा हूँ करने के लिए प्रत्येक रिकॉर्ड में शामिल करना चाहते है? – AakashM

+0

क्या आप कह रहे हैं कि रिलीज तालिका पदानुक्रमित है, उदाहरण के लिए रिलीज़ एक्स में पूर्ववर्ती है, और उसके बाद उस रिलीज का अपना पूर्ववर्ती है, और इसी तरह? तो समस्या किसी भी * बाद * रिलीज के लिए निर्दिष्ट तारीखों के भीतर * मूल * रिलीज को खोजने के लिए है? –

+0

उम्मीद है कि आप 2005 या बाद में हैं - क्या आप पुष्टि कर सकते हैं? –

उत्तर

9

यहाँ एक उदाहरण है, जो उपयोगी हो सकता है। जैसा कि मेरे टेबल में 4 स्तर है -> श्रेणी 7-> 5, 5-> 3, 3-> 1. यदि मैं इसे 5 तक देता हूं तो यह 1 मिलेगा, क्योंकि यह तीनों का शीर्ष स्तर है।

DECLARE @ID int 

SET @ID = 5; 

WITH CTE_Table_1 
(
    ID, 
    Name, 
    ParentID 
) 
AS(
    SELECT 
    ID, 
    Name, 
    ParentID 
    FROM Table_1 
    WHERE ID = @ID 

UNION ALL 

SELECT 
    T.ID, 
    T.Name, 
    T.ParentID 
FROM Table_1 T 
INNER JOIN CTE_Table_1 ON CTE_Table_1.ParentID = T.ID 
) 

SELECT * FROM CTE_Table_1 WHERE ParentID = 0 
+0

डारन, मुझे सीटीई के साथ इसे हराया। अच्छा काम :) –

+0

धन्यवाद, मैं इस सप्ताह में इन 'एल्गोरिदम' का उपयोग कर रहा हूं :) –

+0

क्या यह अनिश्चित काल के लिए काम करेगा? –

1

इस

with cte as 
(
    select id,parent_id from t where [email protected] 
    union all 
    select t.id,t.parent_id 
    from cte 
    join t on cte.parent_id = t.id where cte.parent_id<>0 
) 
select * 
from cte 
join t on cte.id=t.id where cte.parent_id = 0 

की तरह कुछ और बेला के साथ (पिछले चयन आप माता पिता के सभी अप रास्ते पर हो सकता है बदल रहा है।): http://sqlfiddle.com/#!3/a5fa1/1/0

+0

मुझे लगता है कि सीटीई के एंकर सदस्य को ओपी की उदाहरण क्वेरी की तारीख की बाधाओं से निपटना होगा, है ना? –

+0

जो मैं समझता हूं उससे शुरुआती मान पहले चुना जाता है, और उस चयन पर तिथि बाधा होगी। –

0

का उपयोग एनड्रास दृष्टिकोण, मैंने अंतिम चयन को सीधे रूट रिलीज

01 की आईडी देने के लिए संपादित किया

मेरे समस्या अब मैं सभी @IDs (905 कि कोड में) के माध्यम से चलाने के लिए और एक परिणाम के

संबंधित मुद्दे