Работа с дървета в Oracle - Софтуерни продукти

Oracle предлага достатъчно инструменти, за да задоволи почти всяко желание при работа с йерархии. В тази статия ще се опитам да покажа с примери как се прилага и какви резултати се постигат.

Класически пример за дърво е йерархията на служителите в предприятието. За да демонстрираме как да работим с дървета, нека създадем таблица и я попълним с данни:

Нека добавим данни към таблицата:

Стойностите в колоната PARENT_ID всъщност сочат към други редове в таблицата EMPL. За да се покаже получената йерархия, ако имате на разположение стандартен SQL и всеки език за програмиране като C ++, Delphi или C #, ще трябва да напишете доста тромав код. Първо изберете възли от най-високо ниво, след това, в зависимост от избрания възел, поискайте подчинени записи и т.н.

На разположение на потребителя Oracle предоставя клауза PL/SQL - CONNECT BY. Тя ви позволява да изградите йерархия в една заявка, просто и изящно:

Полученият резултат изглежда не съвсем ясен, но ако се вгледате внимателно, можете да видите, че са изградени всички възможни дървета и поддървета. Сега нека добавим клаузата START WITH към заявката:

Обърнете внимание, че клаузата START WITH използва подзаявка, за да определи кой е отгоре. Обикновено полето PARENT_ID за възли е NULL или -1. Естествено, може да има един или повече от тях. Самата конструкция START WIDTH показва откъде да започне изграждането на дървото.

Сега, нека да подредим нещата малко, да подредим записите и да покажем кой е на кое ниво в йерархията. За това Oracle предоставя псевдоколона LEVEL. Може да се използва само ако в заявката присъства CONNECT BY. За простота, нека посочим ID = 1:

Колоната LEVEL може да се използва за маркиране на записа. Използваме оператора за конкатенация (//), за да добавим интервали в началото на всеки ред:

Можете да използвате стандартната клауза WHERE, за да ограничите изхода. Нека премахнем служителите, чието ниво е по-малко или равно на 3 от резултата:

Ако искате да сортирате, струва си да се има предвид, че ORDER BY не работи точно по същия начин, както в случая на прости данни, без йерархия. Нека да демонстрираме това:

Както можете да видите, сортирането е минало по колоната LEVEL и след това по име, но имайте предвид, че най-важното е, че йерархията е запазена и във всяко ниво на йерархията вече има сортиране по име. И какво ще се случи, ако полето LEVEL бъде премахнато от условието за сортиране?