none
Сортировка в запросе RRS feed

  • Вопрос

  • Здравствуйте. В таблице имеется примерный набор данных:  

    id name sortOrder   id_parent
    1 name1 1              NULL
    2 name2 2              NULL
    3 name3 1                1
    4 name4 2                1
    5 name5 3              NULL
    6 name6 1                3

    Записей может быть необязательно 6, а любое количество. В поле id_parent записан id родителя для этой записи. Если в этом поле null, то у этой записи нет родителя, т.е. она как бы стоит в корне дерева, определяющего родство. Уровень до которого распространяется родство может быть от 0 до N.  

    Поле sortOrder определяет порядок записей не по всей таблице, а на уровне родителя.

    Требуется сделать выбор записей из таблицы в порядке возрастания поля sortOrder, c учетом того, что сначала идет запись, у которой нет родителя в порядке sortOrder для записей этого уровня, далее ее потомки, тоже в порядке sortOrder, затем потомки потомков и т.д. до последнего уровня, затем следующая запись по sortOrder, не имеющая родителя и ее потомки и т.д.

    Например, для данного набора записей порядок должен быть следующий:

    1,3,6,4,2,5

    17 декабря 2012 г. 4:22

Ответы

  • Look into using recursive CTE. Check

    CTE and hierarchical queries

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    17 декабря 2012 г. 4:49
  • declare @t table (id int, name char(5), sortOrder int, id_parent int )
    insert into @t
    values    (1,  'name1',  1,  NULL)
          , (2, 'name2', 2, NULL)
          , (3, 'name3', 1, 1)
          , (4, 'name4', 2, 1)
          , (5, 'name5', 3, NULL)
          , (6, 'name6', 1, 3)
          , (7, 'name7', 2, 5);
    
    with cte
    as
    (
    select row_number() over (order by sortOrder) i, * from @t
      where id_parent is null
    union all
    select t1.i, t2.* from cte t1
      inner join @t t2
        on t2.id_parent = t1.id
    )
    select id, name, sortOrder, id_parent 
    from cte 
    order by i, sortOrder


    http://www.t-sql.ru

    • Помечено в качестве ответа Abolmasov Dmitry 25 декабря 2012 г. 12:54
    17 декабря 2012 г. 11:05
    Модератор

Все ответы

  • Look into using recursive CTE. Check

    CTE and hierarchical queries

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    17 декабря 2012 г. 4:49
  • declare @t table (id int, name char(5), sortOrder int, id_parent int )
    insert into @t
    values (1,  'name1',  1,  NULL)
         , (2, 'name2', 2, NULL)
         , (3, 'name3', 1, 1)
         , (4, 'name4', 2, 1)
         , (5, 'name5', 3, NULL)
         , (6, 'name6', 1, 3);
    
    with cte
    as
    (
    select * from @t
      where id_parent is null
    union all
    select t2.* from cte t1
      inner join @t t2
        on t2.id_parent = t1.id
    )
    select stuff( val, 1, 1, '' ) val from
    (
    select ',' + cast( id as varchar ) from cte 
    order by sortOrder
    for xml path('')
    ) t(val)


    http://www.t-sql.ru

    17 декабря 2012 г. 8:23
    Модератор
  • мне кажется первый набор данных не совсем подходит, если попробовать хотя бы на

           (1,  'name1',  1,  NULL)
         , (2, 'name2', 2, NULL)
         , (3, 'name3', 1, 1)
         , (4, 'name4', 2, 1)
         , (5, 'name5', 3, NULL)
         , (6, 'name6', 1, 3)
         , (7, 'name7', 2, 5);

    то результат неверный

    17 декабря 2012 г. 9:49
  • при этом на выходе не строка с порядком id, а те же данные что на входе, только в правильном порядке
    17 декабря 2012 г. 10:10
  • declare @t table (id int, name char(5), sortOrder int, id_parent int )
    insert into @t
    values    (1,  'name1',  1,  NULL)
          , (2, 'name2', 2, NULL)
          , (3, 'name3', 1, 1)
          , (4, 'name4', 2, 1)
          , (5, 'name5', 3, NULL)
          , (6, 'name6', 1, 3)
          , (7, 'name7', 2, 5);
    
    with cte
    as
    (
    select row_number() over (order by sortOrder) i, * from @t
      where id_parent is null
    union all
    select t1.i, t2.* from cte t1
      inner join @t t2
        on t2.id_parent = t1.id
    )
    select id, name, sortOrder, id_parent 
    from cte 
    order by i, sortOrder


    http://www.t-sql.ru

    • Помечено в качестве ответа Abolmasov Dmitry 25 декабря 2012 г. 12:54
    17 декабря 2012 г. 11:05
    Модератор
  • Привет.

    Если ваша проблема решена, не забудьте отметить сообщение решающее проблему.

    Спасибо.


    Для связи [mail]

    18 декабря 2012 г. 10:04