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

1 ... 108 109 110 [ 111 ] 112 113 114 ... 219


EMPNO

ENAME

PROJ ID

PROJ START

PROJ END

7782

CLARK

16-JUN-2005

18-JUN-2005

7782

CLARK

19-JUN-2005

24-JUN-2005

7782

CLARK

22-JUN-2005

25-JUN-2005

7782

CLARK

25-JUN-2005

28-JUN-2005

7782

CLARK

28-JUN-2005

02-JUL-2005

7839

KING

17-JUN-2005

21-JUN-2005

7839

KING

23-JUN-2005

25-JUN-2005

7839

KING

29-JUN-2005

30-JUN-2005

7839

KING

26-JUN-2005

27-JUN-2005

7839

KING

20-JUN-2005

24-JUN-2005

7934

MILLER

18-JUN-2005

22-JUN-2005

7934

MILLER

27-JUN-2005

28-JUN-2005

7934

MILLER

30-JUN-2005

03-JUL-2005

7934

MILLER

24-JUN-2005

27-JUN-2005

7934

MILLER

21-JUN-2005

23-JUN-2005

Взглянув на результаты для служащего 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

ENAME

A ID

A START

A END

B ID

B START

KING

17-JUN-2005

21-JUN-2005

23-JUN-2005

KING

17-JUN-2005

21-JUN-2005

29-JUN-2005

KING

17-JUN-2005

21-JUN-2005

26-JUN-2005

KING

17-JUN-2005

21-JUN-2005

20-JUN-2005

KING

20-JUN-2005

24-JUN-2005

17-JUN-2005

KING

20-JUN-2005

24-JUN-2005

23-JUN-2005

KING

20-JUN-2005

24-JUN-2005

26-JUN-2005

KING

20-JUN-2005

24-JUN-2005

29-JUN-2005

KING

23-JUN-2005

25-JUN-2005

17-JUN-2005

KING

23-JUN-2005

25-JUN-2005

29-JUN-2005

KING

23-JUN-2005

25-JUN-2005

20-JUN-2005



1 ... 108 109 110 [ 111 ] 112 113 114 ... 219

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