كيف يمكنك الحصول على السجل الأخير تم إنشاؤها في العودية CTE?

StackOverflow https://stackoverflow.com/questions/35320

سؤال

في البرمجية أدناه أنا باستخدام العودية CTE(المائدة المشتركة التعبير) في SQL Server 2005 لمحاولة العثور على أعلى مستوى والد الأساسية الهيكل الهرمي.حكم من هذا التسلسل الهرمي هو أن كل CustID لديه ParentID وإذا كان CustID لا الأم ثم ParentID = CustID و هو أعلى مستوى.

DECLARE @LookupID int

--Our test value
SET @LookupID = 1

WITH cteLevelOne (ParentID, CustID) AS
(
        SELECT   a.ParentID, a.CustID
        FROM     tblCustomer AS a
        WHERE    a.CustID = @LookupID
    UNION ALL
        SELECT   a.ParentID, a.CustID
        FROM     tblCustomer AS a
        INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID
        WHERE c.CustID <> a.CustomerID
)

حتى إذا tblCustomer يبدو مثل هذا:

ParentID    CustID
5            5
1            8
5            4
4            1

النتيجة التي أحصل عليها من رمز أعلاه هو:

ParentID    CustID
4            1
5            4
5            5

ما أريده هو فقط في الصف الأخير من هذه النتيجة:

ParentID    CustID
5            5

كيف يمكنني فقط عودة الماضي سجل ولدت في CTE (وهو ما سيكون أعلى مستوى CustID)?

نلاحظ أيضا أن هناك عدة لا علاقة لها CustID الهرمية في هذا الجدول لذلك لا استطيع القيام حدد * من tblCustomer حيث ParentID = CustID.لا أستطيع أن أمر من ParentID أو CustID لأن رقم الهوية ليست ذات الصلة إلى حيث هو في التسلسل الهرمي.

هل كانت مفيدة؟

المحلول

إذا كنت ترغب فقط أريد أعلى العودية العمق لم تفعل شيئا مثل هذا ؟ ثم, عندما كنت في الواقع الاستعلام CTE مجرد إلقاء نظرة على التوالي مع ماكس(عمق)?مثل ذلك:

DECLARE @LookupID int

--Our test value
SET @LookupID = 1;

WITH cteLevelOne (ParentID, CustID, Depth) AS
(
        SELECT   a.ParentID, a.CustID, 1
        FROM     tblCustomer AS a
        WHERE    a.CustID = @LookupID
    UNION ALL
        SELECT   a.ParentID, a.CustID, c.Depth + 1
        FROM     tblCustomer AS a
        INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID 
        WHERE c.CustID <> a.CustID
)
select * from CTELevelone where Depth = (select max(Depth) from CTELevelone)

أو التكيف مع ما تريفور يشير إلى أن هذا يمكن أن تستخدم مع نفس CTE:

select top 1 * from CTELevelone order by Depth desc

لا أعتقد معرف العميل بالضرورة ما أردت أن النظام في حالة وصفت, ولكن لم يكن واضحا تماما على السؤال أيضا.

نصائح أخرى

أنا لست متأكدا من أنني أفهم تماما المشكلة ، ولكن فقط هاك & سلاش في ذلك قد تتمكن من محاولة:

SELECT TOP 1 FROM cteLevelOne ORDER BY CustID DESC

التي يفترض أن CustID أيضا في النظام كما في المثال و ليس شيء مثل GUID.

أولا cte لن ينتهي إذا كان أي من الوالدين الطفل نفسه.كما هو العودية CTE يجب أن يكون إنهاء.وجود الوالدين الزبون معرف نفسه , حلقة لن تنتهي.

Msg 530, 16, مستوى الدولة 1 15 بيان إنهاء.أقصى العودية 100 قد استنفدت قبل إكمال بيان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top