طلب التسلسل الهرمي من نتائج الاستعلام العودية في SQL 2005
-
22-08-2019 - |
سؤال
لدي جدول "المهمة" مع الأعمدة التالية (المهمة هو لطلب الأطفال داخل نطاق الوالد، وليس الجدول بأكمله):
Taskid ParentTaskid Taskname TaskAress
لقد حصلت على استعلام CTE هذا لإرجاع كل الصفوف:
with tasks (TaskId, ParentTaskId, [Name]) as
(
select parentTasks.TaskId,
parentTasks.ParentTaskId,
parentTasks.[Name]
from Task parentTasks
where ParentTaskId is null
union all
select childTasks.TaskId,
childTasks.ParentTaskId,
childTasks.[Name]
from Task childTasks
join tasks
on childTasks.ParentTaskId = tasks.TaskId
)
select * from tasks
إرجاع هذا الاستعلام جميع المهام المطلوبة من مستواه كما تتوقع. كيف يمكنني تغييره لطلب النتائج إلى أمر التسلسل الهرمي على النحو التالي؟
- المهمة 1 - المهمة 1 الفرعية 1 - المهمة 1 الفرعية 2 - المهمة 2 - المهمة 3
شكرا.
يحرر: يجب أن تعمل الجواب مع عدد numbr غير محدود من المستويات.
المحلول 2
حل المشكلة باستخدام اختلاف طريقة علامة, لكنني لا أبدي مسار العقدة في كل عقدة، لذلك يمكنني نقلها بسهولة أكبر حول الشجرة. بدلا من ذلك، قمت بتغيير عمود "Orderby" الخاص بي من INT To Varchar (3) مبطن بالأيسر مع الأصفار حتى أتمكن من التخلص إليهم في سيد "ترتيب" لجميع الصفوف التي عادت.
with tasks (TaskId, ParentTaskId, OrderBy, [Name], RowOrder) as
(
select parentTasks.TaskId,
parentTasks.ParentTaskId,
parentTasks.OrderBy,
parentTasks.[Name],
cast(parentTasks.OrderBy as varchar(30)) 'RowOrder'
from Task parentTasks
where ParentTaskId is null
union all
select childTasks.TaskId,
childTasks.ParentTaskId,
childTasks.OrderBy,
childTasks.[Name],
cast(tasks.RowOrder + childTasks.OrderBy as varchar(30)) 'RowOrder'
from Task childTasks
join tasks
on childTasks.ParentTaskId = tasks.TaskId
)
select * from tasks order by RowOrder
هذه المرتجعات:
Taskid ParentTaskid OrderBy اسم Roworder ---------------------------------------------- ------------------------------ 1 NULL 001 مهمة 001 15 1 001 المهمة واحدة / المهمة واحد 001001 2 null 002 المهمة اثنين 002 7 2 001 المهمة الثانية / المهمة One 002001 14 7 001 مهمة / مهمة واحدة / مهمة واحدة 002001001 8 2 002 المهام اثنين / المهام اثنين 002002 9 8 001 المهام الثانية / المهمة الثانية / المهمة واحدة 002002001 10 002 المهام اثنين / المهام اثنان / المهمة اثنين 002002002 11 8 003 المهام الثانية / المهمة الثانية / المهمة ثلاثة 002002003 3 null 003 المهمة ثلاثة 003 4 null 004 المهام أربعة 004 13 4 001 المهام أربعة / المهمة واحدة 004001 5 null 005 المهمة خمسة 005 6 null 006 المهمة ستة 006 17 NULL 007 مهمة Seven 007 18 NULL 008 مهمة ثمانية 008 19 NULL 009 المهمة تسعة 009 21 19 001 المهمة تسعة / مهمة 009001 20 NULL 010 TASK 010
لا يسمح بتسلسل هرمي غير محدود (ماكس 10 مستويات / كحد أقصى 1000 طفل لكل عقدة الأصل - إذا كنت قد بدأت orderby في 0) ولكن أكثر من كافية لاحتياجاتي.
نصائح أخرى
طريقة واحدة يمكنك القيام بذلك هي إضافة عمود هرمي له جميع المعرفات السابقة في القائمة:
with tasks (TaskId, ParentTaskId, [Name], TaskIdList) as
(
select parentTasks.TaskId,
parentTasks.ParentTaskId,
parentTasks.[Name],
parentTasks.TaskId
from Task parentTasks
where ParentTaskId is null
union all
select childTasks.TaskId,
childTasks.ParentTaskId,
childTasks.[Name],
tasks.TaskIdList + '.' + childTasks.TaskId
from Task childTasks
join tasks
on childTasks.ParentTaskId = tasks.TaskId
)
select TaskId, ParentTaskId, [Name] from tasks
order by TaskIdList
لاحظ أن هذا يفترض أن STASSIC هو معرف يستند إلى سلسلة. إذا لم يكن الأمر كذلك، يجب عليك إلقاء ذلك على Varchar قبل التزامن.
لا تحتاج إلى كل هذه الأشياء النقابة، وأعتقد أن هذا يجب أن يعمل:
select
TaskId,
ParentTaskId,
[Name],
COALESCE(ParentTaskId, TaskId) as groupField
from
task
order by
COALESCE(ParentTaskId, TaskId), ParentTaskId, TaskId
نظرا لأنك لا تحدد "أمر من قبل"، كيف تتوقع أنه يعيدهم بأي أمر معين (بخلاف أمل أن يعمل محلل الاستعلام في بعض الأزياء المتوقعة؟).
إذا كنت تريد ذلك في ParentTAskID، فالترتيب المهني، فحدد SatormID باسم ParentTAskID و NULL باسم SatorId في عنصر الاتحاد الأول؛ ومن بعد
ترتيب بواسطة ParentTaskid، Satormid؟