|
Программирование >> Преобразование значений null
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, чтобы найти имя руководителя для каждого служащего. Затем с помощью предоставляемых СУБД функций, реализующих конкатенацию, сформировать строки и организовать требуемое результирующее множество.
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
Как видите, декартово произведение возвращает все возможные сочетания 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
Теперь, когда имеем по одной строке для каждого служащего и EMP-NO его руководителя, получить имя руководителя можно, просто выбирая B.ENAME, а не B.EMPNO. Если даже после нескольких попыток возникают трудности с пониманием того, как все это происходит, можно вместо рефлексивного объединения прибегнуть к скалярному подзапросу:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |