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

1 ... 167 168 169 [ 170 ] 171 172 173 ... 219


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

from 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) where a.ename = KING

PARTIAL TREE

KING KING KING KING KING KING KING KING KING KING KING KING KING

BLAKE BLAKE BLAKE BLAKE BLAKE BLAKE CLARK CLARK JONES JONES JONES JONES JONES

ALLEN

JAMES

MARTIN

TURNER

WARD

MILLER

FORD

FORD - SMITH

SCOTT

SCOTT - ADAMS

Заключительный шаг - с помощью операции UNION вставить строку служащего KING в верхушку PARTIAL TREE и получить требуемое результирующее множество.

Выбор всех дочерних строк для заданной строки Задача

Требуется найти всех служащих, которые прямо или косвенно (т. е. являются подчиненными того, кто подчиняется JONES) подчиняются JONES. Список подчиненных JONES показан ниже (JONES включен в результирующее множество):

ENAME

JONES

SCOTT

ADAMS

FORD

SMITH

Решение

Здесь очень пригодится возможность переходить в самый верх или самый низ дерева иерархии. Для этого решения не требуется специаль-



with

x (ename,empno)

select

ename,empno

from

where

ename = JONES

union

select

e.ename, e.empno

from

emp e, x

where

x.empno = e.mgr

select

ename

from

Oracle

Используйте оператор CONNECT BY и задайте START WITH ENAME = JONES, чтобы найти всех подчиненных JONES:

1 select ename

2 from emp

3 start with ename = JONES

4 connect by prior empno = mgr

PostgreSQL и MySQL

Необходимо заранее знать количество узлов в дереве. Следующий запрос показывает, как определить глубину иерархии:

/* находим EMPNO служащего JONES */ select ename,empno,mgr from emp where ename = JONES

ENAME EMPNO MGR

JONES 75bb 7839

/* есть ли служащие, находящиеся в прямом подчинении у JONES? */ select count(*) from emp where mgr = 7566

COUNT(*)

ного форматирования. Цель - просто выбрать всех служащих, работающих под руководством JONES, включая самого JONES. Подобные задачи, на самом деле, демонстрируют ценность таких рекурсивных расширений SQL, как операторы CONNECT BY для Oracle и WITH для SQL Server/DB2.

DB2 и SQL Server

С помощью рекурсивного оператора WITH найдите всех подчиненных JONES. Начинайте с JONES, задав WHERE ENAME = JONES в первом из двух объединяемых запросов.



/* у JONES двое подчиненных, найдем их EMPNO */ select ename,empno,mgr from emp where mgr = 7566

ENAME EMPNO MGR

SCOTT 7788 7566

FORD 7902 7566

/* есть ли подчиненные у SCOTT или FORD? */ select count(*) from emp where mgr in (7788,7902)

COUNT(.)

/* у SCOTT и FORD двое подчиненных, находим их EMPNO */ select ename,empno,mgr

from emp

where mgr in (7788,7902)

ENAME EMPNO MGR

SMITH 7369 7902

ADAMS 7876 7788

/* есть ли подчиненные у SMITH или ADAMS? */ select count(*) from emp

where mgr in (7369,7876)

COUNT(.)

Иерархия, начинающаяся со служащего JONES, заканчивается служащими SMITH и ADAMS, таким образом, имеем трехуровневую иерархию. Теперь, когда известна глубина, можно приступать к обходу иерархии сверху вниз.

Сначала дважды выполним рефлексивное объединение таблицы EMP. Затем произведем обратное разворачивание вложенного представления Х, чтобы преобразовать три столбца и две строки в один столбец и шесть строк (в PostgreSQL как альтернативу запросу к сводной таблице T100 можно использовать GENERATE SERIES(1,6):

1 select distinct

2 case t100.id

3 when 1 then root



1 ... 167 168 169 [ 170 ] 171 172 173 ... 219

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