2015-10-09 5 views
0

В настоящее время я пытаюсь создать многоуровневую структуру из разных таблиц Существует множество шагов для теста. Лежащая в основе отношения:SQL: запрос многоуровневых иерархических таблиц

1. parent sequence AA 
1.1 child sequence BB 
    1.1.1 Step CC 

Есть три таблицы:

result_uut имеет следующие столбцы:

uut_id, uut_serial_number, uut_name 

result_seq имеет

uut_id, step_id, step_parent_id, step_name 

result_uut и result_seq связывают uut_id отношения родитель-ребенок отражается step_id = step_parent_id

result_step имеет

uut_id, step_id, step_parent_id, step_name 

Это связано с result_seq по result_seq.step_id = result_step.step_parent_id

Интересно, как дать выход есть родитель имя след, имя ребенка НомерСтарта , и имя шага, и отображение в порядке (1->1.1->1.1.1->1.1.2...).

+0

Какая система РСУБД вы используете? Каждый из них имеет свои собственные методы обработки иерархий (SQL Server имеет, например, CTE, Oracle как «CONNECT BY») –

+0

Я использую MySQL – user5425156

ответ

0

Не тестировались, я надеюсь, что я получил это право, но если не по крайней мере, вы получите идею (предположение, что вы работаете с 32-битными Интсами для uut_id):

select cmb.tag from (select uut_id as tag,concat(lpad(uut_id,10,'0'),repeat('0',20)) as ord or from result_uut 
union 
select concat_ws('.',aa.uut_id,bb.uut_id,cc.uut_id) as tag,concat(lpad(aa.uut_id,10,'0'),lpad(bb.uut_id,10,'0'),repeat('0',10)) as ord from result_uut aa join result_seq bb on aa.uut_id = bb.step_parent_uut_id 
union 
select concat_ws('.',aa.uut_id,bb.uut_id,cc.uut_id) as tag,concat(lpad(aa.uut_id,10,'0'),lpad(bb.uut_id,10,'0'),lpad(cc.uut_id,10,'0') as ord from result_uut aa join result_seq bb on aa.uut_id = bb.step_parent_uut_id join result_step cc on bb.uut_id = cc.step_parent_uut_id) cmb order by ord; 

Идея заключается в том, что мы используем объединения для генерации тегов, при этом каждый тэг мы генерируем ord-токен, который представляет собой 30-значное целое число, полученное конкатенацией uut_ids, каждая из которых заполняется до 10 цифр. Этот взлом необходим, потому что, если мы просто попытаемся построить фактическое целое число, мы переполним 64 бита. Затем мы объединяем, упорядочиваем по орду и отбрасываем орд с помощью простого подзапроса.