سؤال

لدي جدول "المهمة" مع الأعمدة التالية (المهمة هو لطلب الأطفال داخل نطاق الوالد، وليس الجدول بأكمله):

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؟

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