|
Программирование >> Преобразование значений null
-->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
Решение DB2 и SQL Server Используя рекурсивный оператор WITH, начинайте построение иерархии с KING и в итоге выведите всех служащих. В представленном далее решении используется оператор конкатенации DB2 . Для SQL Server используется оператор конкатенации + . Во всем остальном решения для обеих СУБД ничем не отличаются:
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |