Программирование >>  Преобразование значений null 

1 ... 164 165 166 [ 167 ] 168 169 170 ... 219


-->MILLER-->CLARK-->KING

Заключительный шаг - используем функцию LTRIM для удаления символа --> в начале результирующего множества.

PostgreSQL и MySQL

Если СУБД не обеспечивает встроенной поддержки иерархических запросов, для получения всего дерева иерархии приходится выполнять рефлексивные объединения n раз (где n - количество узлов между концевым и корневым узлами, включая корневой узел; в этом примере CLARK относительно MILLER является узлом ветвления, а KING -корневым узлом, таким образом, расстояние - два узла, и n = 2). В данном решении просто используется техника из предыдущего рецепта и добавляется еще одно рефлексивное объединение:

select a.ename as leaf,

b.ename as branch,

c.ename as root from emp a, emp b, emp c

where a.ename = MILLER

and a.mgr = b.empno

and b.mgr = c.empno

LEAF BRANCH ROOT

MILLER CLARK KING

Следующий и последний шаг - отформатировать вывод, используя оператор конкатенации для PostgreSQL или функцию CONCAT для MySQL. Недостаток такого запроса в том, что при изменении иерархии -например, если появляется еще один узел между CLARK и KING - для получения всего дерева в запрос придется вводить еще одно объединение. Вот почему при работе с иерархиями так удобно пользоваться встроенными функциями СУБД, если они есть.

Создание иерархического представления таблицы Задача

Требуется получить результирующее множество, описывающее иерархию всей таблицы. Рассмотрим таблицу EMP. В ней у служащего KING нет руководителя, поэтому KING является корневым узлом. Необходимо представить, начиная с KING, всех служащих, подчиняющихся KING, и всех служащих (если таковые имеются), подчиняющихся подчиненным KING. В итоге должно быть получено следующее результирующее множество:

EMP TREE

KING



KING

- BLAKE

KING

- BLAKE -

ALLEN

KING

- BLAKE -

JAMES

KING

- BLAKE -

MARTIN

KING

- BLAKE -

TURNER

KING

- BLAKE -

WARD

KING

- CLARK

KING

- CLARK -

MILLER

KING

- JONES

KING

- JONES -

FORD

KING

- JONES -

FORD -

KING

- JONES -

SCOTT

KING

- JONES -

SCOTT

Решение

DB2 и SQL Server

Используя рекурсивный оператор WITH, начинайте построение иерархии с KING и в итоге выведите всех служащих. В представленном далее решении используется оператор конкатенации DB2 . Для SQL Server используется оператор конкатенации + . Во всем остальном решения для обеих СУБД ничем не отличаются:

with

select

from

where

union

select

from

where

select

from

order

Oracle

e.empno

Для описания иерархии используйте функцию CONNECT BY. С помощью функции SYS CONNECT BY PATH отформатируйте результаты соответствующим образом:

1 select ltrim(

2 sys connect by path(ename,

3 - ) emp tree

4 from emp

5 start with mgr is null

6 connect by prior empno=mgr

7 order by 1



Это решение отличается от приведенного в предыдущем рецепте тем, что не включает фильтр по псевдостолбцу LEVEL. Без этого фильтра выводятся все возможные деревья (где PRIOR EMPNO=MGR).

PostgreSQL

Используйте три оператора UNION и несколько рефлексивных объединений:

10 11 12 13 14 15 16 17

19 20 21 22

24 25

29 30 31 32 33 34

select

from select

from where union select

from

where union select

from

where union

select

from

emp tree

ename as emp tree emp

mgr is null

a.ename - b.ename

emp a

join

emp b on (a.empno=b.mgr) a.mg r is null

b.ename c.ename,

where

where order

rtrim(a. ename

emp a join

emp b on (a.empno=b.mgr) left join

emp c on (b.empno=c.mgr) a.ename = KING

rtrim(a.ename - b.ename - c.ename - d.ename, - )

emp a join

emp b on (a.empno=b.mgr) join

emp c on (b.empno=c.mgr) left join

emp d on (c.empno=d.mgr) a.ename = KING ) x

tree is not null

by 1

MySQL

Используйте три оператора UNION и несколько рефлексивных объединений:

1 select emp tree

2 from (

3 select ename as emp tree

4 from emp



1 ... 164 165 166 [ 167 ] 168 169 170 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика