كيف يمكنك الحصول على السجل الأخير تم إنشاؤها في العودية CTE?
-
09-06-2019 - |
سؤال
في البرمجية أدناه أنا باستخدام العودية 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 قد استنفدت قبل إكمال بيان.