|
Программирование >> Преобразование значений null
Взглянув на результаты для служащего KING, мы видим, что он начал проект PROJID 8 до завершения PROJID 5, а также начал проект PROJID 5 до завершения проекта PROJID 2. Должно быть получено следующее результирующее множество: EMPNO ENAME MSG DATE удаляются, чтобы максимально приблизить результаты промежуточных запросов к окончательному результирующему множеству): select a.ename as emp1, b.ename as emp2 from emp a, emp b where to char(a.hiredate,DMON) = to char(b.hiredate,DMON) and a.empno < b.empno order by 1 EMP1 EMP2 JAMES FORD SCOTT JAMES SCOTT FORD Заключительный шаг - простая конкатенация результирующего множества для формирования сообщения. Выявление наложений диапазонов дат Задача Требуется найти всех служащих, начинающих новый проект до завершения текущего. Рассмотрим таблицу EMP PROJECT: select * from emp project 7782 CLARK project 7 overlaps project 4 7782 CLARK project 10 overlaps project 7 7782 CLARK project 13 overlaps project 10 7839 KING project 8 overlaps project 5 7839 KING project 5 overlaps project 2 7934 MILLER project 12 overlaps project 9 7934 MILLER project 6 overlaps project 3 Решение Ключ к решению - найти строки, в которых PROJSTART (дата начала нового проекта) совпадает или выпадает между значениями PROJ START и PROJ END (дата окончания проекта) другого проекта. Для начала мы должны получить возможность сравнивать даты начала и окончания проектов (одного служащего). Осуществляя рефлексивное объединение EMP PROJECT по служащим, мы получаем все возможные сочетания двух проектов для каждого служащего. Чтобы выявить наложения, просто находим строки, где PROJ START для одного PROJ ID выпадает между PROJ START и PROJ END другого PROJ ID одного и того же служащего. DB2, PostgreSQL и Oracle Выполните рефлексивное объединение EMP PROJECT. Затем с помощью оператора конкатенации скомпонуйте сообщение, описывающее, какие проекты перекрываются: 1 select a.empno,a.ename, 2 project b. proj id 3 overlaps project a.proj id as msg 4 from emp project a, 5 emp project b 6 where a.empno = b.empno 7 and b.proj start >= a.proj start 8 and b.proj start <= a.proj end 9 and a.proj id != b.proj id MySQL Выполните рефлексивное объединение EMP PROJECT. Затем с помощью функции конкатенации CONCAT скомпонуйте сообщение, описывающее, какие проекты перекрываются: 1 select a.empno,a.ename, 2 concat(project ,b.proj id, 3 overlaps project ,a.proj id) as msg 4 from emp project a, 5 emp project b 6 where a.empno = b.empno 7 and b.proj start >= a.proj start 8 and b.proj start <= a.proj end 9 and a.proj id != b.proj id SQL Server Выполните рефлексивное объединение EMP PROJECT. Затем с помощью оператора конкатенации + скомпонуйте сообщение, описывающее, какие проекты перекрываются: 1 select a.empno,a.ename, 2 project +b.proj id+ 3 overlaps project +a.proj id as msg 4 from emp project a, 5 emp project b 6 where a.empno = b.empno 7 and b.proj start >= a.proj start 8 and b.proj start <= a.proj end 9 and a.proj id != b.proj id Обсуждение Все решения отличаются лишь в части, касающейся конкатенации строк, поэтому обсудим всех их на примере синтаксиса DB2. Первый шаг - рефлексивное объединение EMP PROJECT, которое обеспечивает возможность сравнения дат PROJ START разных проектов. Результат рефлексивного объединения для служащего KING показан ниже. Из него становится ясно, как каждый проект может видеть другие проекты: select a.ename, a.proj id as a id, a.proj start as a start, a.proj end as a end, b.proj id as b id, b.proj start as b start from emp project a, emp project b where a.ename = KING and a.empno = b.empno and a.proj id != b.proj id order by 2
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |