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

1 ... 19 20 21 [ 22 ] 23 24 25 ... 219


ENAME

RECEIVED

SCOTT

DALLAS

14-MAR-2005

SMITH

DALLAS

14-MAR-2005

JAMES

CHICAGO

14-MAR-2005

необходимо получить такое результирующее множество:

ENAME

RECEIVED

ALLEN

CHICAGO

WARD

CHICAGO

MARTIN

CHICAGO

JAMES

CHICAGO

14-MAR-2005

TURNER

CHICAGO

BLAKE

CHICAGO

SMITH

DALLAS

14-MAR-2005

FORD

DALLAS

ADAMS

DALLAS

JONES

DALLAS

SCOTT

DALLAS

14-MAR-2005

CLARK

NEW YORK

KING

NEW YORK

MILLER

NEW YORK

Решение

Для получения дополнительной информации без утраты данных, возвращенных в результате исходного запроса, можно использовать внешнее объединение. Сначала объединим таблицы EMP и DEPT и получим список всех служащих и местонахождений отделов, в которых они работают. Затем выполним внешнее объединение с таблицей EMP BONUS, чтобы возвратить даты получения премий, если таковые были выданы. Ниже приведен синтаксис для DB2, MySQL, Post-

greSQL и SQL Server:

1 select e.ename, d.loc, eb.received

2 from emp e join dept d

3 on (e.deptno=d.deptno)

4 left join emp bonus eb

5 on (e.empno=eb.empno)

6 order by 2

Предыдущее решение подходит также для Oracle 9i Database и более поздних версий. В качестве альтернативы можно использовать собственный синтаксис Oracle для внешнего объединения, который будет работать и для Oracle 8i Database и более ранних версий:

1 select e.ename, d.loc, eb.received

2 from emp e, dept d, emp bonus eb

3 where e.deptno=d.deptno

4 and e.empno=eb.empno (+)

5 order by 2



Имитировать внешнее объединение можно с помощью скалярного подзапроса (подзапроса, размещаемого в списке SELECT):

1 select e.ename, d.loc,

2 (select eb.received from emp bonus eb

3 where eb.empno=e.empno) as received

4 from emp e, dept d

5 where e.deptno=d.deptno

6 order by 2

Решение с использованием скалярного подзапроса подходит для всех платформ.

Обсуждение

В результате внешнего объединения будут возвращены все строки одной таблицы и соответствующие им строки другой таблицы. Еще один пример такого объединения представлен в предыдущем рецепте. Причина, почему внешнее объединение обеспечивает решение данной задачи, в том, что оно не приводит к удалению строк. Запрос возвратит все строки, которые были бы возвращены без внешнего объединения, а также дополнительные данные из другой таблицы, если таковые имеются.

Для решения задач такого рода также удобно пользоваться скалярными подзапросами, поскольку при этом не приходится менять уже состоявшиеся объединения основного запроса. Скалярный подзапрос -простой способ внести дополнительные данные в запрос, не подвергая опасности текущее результирующее множество. Скалярные подзапросы должны гарантированно возвращать скалярное (одно) значение. Если подзапрос в списке SELECT возвращает более одной строки, будет получена ошибка.

См. также

В главе 14 в разделе Преобразование скалярного подзапроса в составной подзапрос (Oracle) показано, как обеспечить возвращение нескольких строк из подзапроса, размещаемого в списке оператора SELECT.

Выявление одинаковых данных в двух таблицах Задача

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

create view V as

select * from emp where deptno != 10

union all

select * from emp where ename = WARD



select * from V

EMPNO

ENAME

HIREDATE

COMM

DEPTNO

7369

SMITH

CLERK

7902

17-DEC-1980

7499

ALLEN

SALESMAN

7698

20-FEB-1981

1600

7521

WARD

SALESMAN

7698

22-FEB-1981

1250

7566

JONES

MANAGER

7839

02-APR-1981

2975

7654

MARTIN

SALESMAN

7698

28-SEP-1981

1250

1400

7698

BLAKE

MANAGER

7839

01-MAY-1981

2850

7788

SCOTT

ANALYST

7566

09-DEC-1982

3000

7844

TURNER

SALESMAN

7698

08-SEP-1981

1500

7876

ADAMS

CLERK

7788

12-JAN-1983

1100

7900

JAMES

CLERK

7698

03-DEC-1981

7902

FORD

ANALYST

7566

03-DEC-1981

3000

7521

WARD

SALESMAN

7698

22-FEB-1981

1250

Требуется выяснить, имеются ли в этом представлении такие же данные, как и в таблице EMP. Строка для служащего WARD продублирована, чтобы продемонстрировать, что решение обеспечит выявление не только различных, но и дублированных данных. Сравнение с таблицей EMP дает три строки для служащих 10-го отдела и две строки для служащего WARD. Должно быть получено следующее результирующее множество:

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CNT

7521

WARD

SALESMAN

7698

22-FEB-1981

1250

7521

WARD

SALESMAN

7698

22-FEB-1981

1250

7782

CLARK

MANAGER

7839

09-JUN-1981

2450

7839

KING

PRESIDENT

17-NOV-1981

5000

7934

MILLER

CLERK

7782

23-JAN-1982

1300

Решение

Функции, осуществляющие вычитание множеств (MINUS или EXCEPT, в зависимости от СУБД), существенно упрощают задачу по сравнению таблиц. Если ваша СУБД не поддерживает таких функций, можно использовать связанный подзапрос.

DB2 и PostgreSQL

Чтобы найти совокупность отличий между представлением V и таблицей EMP, используйте операции над множествами EXCEPT и UNION

ALL:

2 select empno,ename,job,mgr,hiredate,sal,comm,deptno,

3 count(*) as cnt

4 from V

5 group by empno,ename,job,mgr,hiredate,sal,comm,deptno

6 except

7 select empno,ename,job,mgr,hiredate,sal,comm,deptno,



1 ... 19 20 21 [ 22 ] 23 24 25 ... 219

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