Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как заполнить случайными данными иерархическую таблицу?  [new]
Я - дерево
Guest
Нужно для тестов. Табличка простейшего вида:
create table #tree (
  id int not null primary key,
  parent int
)
alter table #tree add foreign key (parent) references #tree (id)

Требуется нагенерить ~1000 записей, глубина иерархии на каждой ветке произвольная, но не больше 10. Пока смог родить только жутковатый вариант из курсоров и циклов. Можно ли это сделать как-то поизящнее?
19 дек 13, 06:31    [15314912]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить случайными данными иерархическую таблицу?  [new]
Добрый Э - Эх
Guest
рекурсивным CTE ?
19 дек 13, 06:33    [15314914]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить случайными данными иерархическую таблицу?  [new]
Я - дерево
Guest
Добрый Э - Эх,

Думал в этом направлении. Получилось только строго упорядоченное дерево с постоянной глубиной иерархии по каждой ветке. Это не подходит.
19 дек 13, 06:39    [15314917]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить случайными данными иерархическую таблицу?  [new]
Добрый Э - Эх
Guest
Я - дерево,

Чтоле, вместо дерева у тебя получилась бамбуковая роща?
19 дек 13, 06:48    [15314922]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить случайными данными иерархическую таблицу?  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх,

Вот тут вчера дерево комбинаций чисел строил. Может чем-то поможет...
Глубина дерева регулируется кол-вом элементов в списке первого СТЕ. Ветки получаются разнодлинные.
19 дек 13, 06:51    [15314924]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить случайными данными иерархическую таблицу?  [new]
Я - дерево
Guest
Добрый Э - Эх,

спасибо за на пивоводку. Получилось примерно то, что я хотел, вот таким макаром:
truncate table dbo.t_tree;
declare
  @root_length int=100,
  @max_depth int = 10;
;with cte0(id) as (
  select number from master..spt_values where type='P' and number between 1 and @root_length
), cte1 as (
  select id, null parent, 0 level
  from cte0
  union all
  select e.id+@root_length, f2.parent, e.level+f3.inc
  from cte1 e
  cross apply (
    select convert(int, rand(checksum(newid()))*2)
  ) f1(inc)
  cross apply (
    -- чтобы родительскими узлами (parent=null) были только записи cte0
    select case when f1.inc=1 or e.parent is null then 1 else 0 end
  ) f3(inc)
  cross apply (
    --чтобы дерево не было равномерно возрастающим
    select case f3.inc when 1 then e.id else e.parent end
  ) f2(parent)
  where e.level<=convert(int,rand(checksum(newid()))*@max_depth) -- произвольная глубина иерархии
)
insert into dbo.t_tree select id, parent from cte1;

-- проверка
;with cte as (
  select id, parent, 0 level, convert(varchar(max), id) path
  from dbo.t_tree where parent is null
  union all
  select t.id, t.parent, e.level+1, convert(varchar(max), e.path+'/'+convert(varchar, t.id))
  from dbo.t_tree t
  join cte e on e.id=t.parent
)
select * from cte order by path

- с произвольной глубиной иерархии, и возможным повторением узлов на одном уровне иерархии.
19 дек 13, 08:37    [15315031]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить