вівторок, 22 червня 2010 р.

Ієрархічні структури в Oracle

Трапляється таке в житті, що доводеться різні ієрархічні структури збрегати до реляційних СКБД. І що ще гірше, потім їх оброблювати. Власне, залишимо механіхми мапінгу осторонь і звернемо наші погляди на те, як можна елегантно працювати з ієрархіями в Oracle (звісно, якщо вам пощастило і у вас Oracle).
Мова йде про використання своєрідного "синтаксичного цукру" start with .. connect by

Отже, якщо у вас є дерево і ви створете таблицю на зразок
create table node(
id number,
parent number,
my_data varchar2(80)
);

заповните цю таблицю даними, то пройти по ієрархії, знаючи лише батька буде дуже просто, а саме:
select lpad(' ',2*(level-1)) || my_data tree_node    from node    start with id=?   connect by prior id = parent;
тобто ідея зрозуміла. level - це псевдоколонка, яка автоматично з"являється
під час операцій над ієрархічними структурами (рахувати починаємо з 1) 
Так само просто зробити якийсь апдейт, наприклад
update node set my_data = 'Wine'
where id in (select id from node start with id=? connect by prior id = parent)
PS. мій перший допис. будьте ласкаві, не ругайте дуже сильно:)