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

1 ... 161 162 163 [ 164 ] 165 166 167 ... 219


7782 7839 7698 7839 7369 7902 7839

Если посмотреть внимательно, можно увидеть, что каждое значение из MGR также присутствует и в EMPNO. Это говорит о том, что каждый руководитель в таблице EMP также является служащим, запись о котором хранится в таблице EMP, а не где-то в другом месте. Отношение между MGR и EMPNO - это отношение родитель-потомок, потому что значение MGR является непосредственным родителем данного EMPNO (возможно также, что руководитель, в свою очередь, является подчиненным руководителя, который работает под чьим-то руководством, и т. д.; в результате создается и-уровневая иерархия). Если у служащего нет руководителя, для него в поле MGR содержится значение NULL.

Представление отношений родитель-потомок

Задача

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

EMPS AND MGRS

FORD works for JONES SCOTT works for JONES JAMES works for BLAKE TURNER works for BLAKE

MARTIN works for BLAKE WARD works for BLAKE ALLEN works for BLAKE MILLER works for CLARK ADAMS works for SCOTT CLARK works for KING BLAKE works for KING JONES works for KING SMITH works for FORD

Решение

Выполнить рефлексивное объединение EMP по MGR и EMPNO, чтобы найти имя руководителя для каждого служащего. Затем с помощью предоставляемых СУБД функций, реализующих конкатенацию, сформировать строки и организовать требуемое результирующее множество.



EMPNO

7369

7369

7369

7499

7369

7521

7369

7566

7369

7654

7369

7698

7369

7782

7369

7788

7369

7839

7369

7844

7369

7876

7369

7900

DB2, Oracle и PostgreSQL

Проведите рефлексивное объединение EMP. Затем используйте оператор конкатенации, двойную вертикальную черту ():

1 select a.ename works for b.ename as emps and mgrs

2 from emp a, emp b

3 where a.mgr = b. empno

MySQL

Проведите рефлексивное объединение EMP. Затем используйте функцию конкатенации CONCAT:

1 select concat(a.ename, works for ,b.ename) as emps and mgrs

2 from emp a, emp b

3 where a.mgr = b.empno

SQL Server

Проведите рефлексивное объединение EMP. Затем используйте знак плюс (+) как оператор конкатенации:

1 select a.ename + works for + b.ename as emps and mgrs

2 from emp a, emp b

3 where a.mgr = b.empno

Обсуждение

Реализация всех решений, по сути, одинаковая. Разница лишь в средстве конкатенации строк. Таким образом, будем рассматривать сразу все решения.

Ключ к решению - объединение MGR и EMPNO. Первый шаг - создать декартово произведение, объединяя EMP с самой собой (возвращаемые в результате декартова произведения строки показаны ниже лишь частично):

select a.empno, b.empno from emp a, emp b



7369

7902

7369

7934

7499

7369

7499

7499

7499

7521

7499

7566

7499

7654

7499

7698

7499

7782

7499

7788

7499

7839

7499

7844

7499

7876

7499

7900

7499

7902

7499

7934

Как видите, декартово произведение возвращает все возможные сочетания EMPNO/EMPNO (это выглядит так, как будто руководителем служащего с EMPNO 7369 являются все остальные сотрудники, представленные в таблице, включая EMPNO 7369).

Следующий шаг - фильтруем результаты так, чтобы осталось по одной строке для каждого служащего и EMPNO его руководителя. Осуществляем это, проводя объединение по MGR и EMPNO:

select a.empno, b.empno mgr from emp a, emp b where a.mgr = b.empno

EMPNO

7902

7566

7788

7566

7900

7698

7844

7698

7654

7698

7521

7698

7499

7698

7934

7782

7876

7788

7782

7839

7698

7839

7566

7839

7369

7902

Теперь, когда имеем по одной строке для каждого служащего и EMP-NO его руководителя, получить имя руководителя можно, просто выбирая B.ENAME, а не B.EMPNO. Если даже после нескольких попыток возникают трудности с пониманием того, как все это происходит, можно вместо рефлексивного объединения прибегнуть к скалярному подзапросу:



1 ... 161 162 163 [ 164 ] 165 166 167 ... 219

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