|
Программирование >> Преобразование значений null
Решение Для получения дополнительной информации без утраты данных, возвращенных в результате исходного запроса, можно использовать внешнее объединение. Сначала объединим таблицы 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
Требуется выяснить, имеются ли в этом представлении такие же данные, как и в таблице EMP. Строка для служащего WARD продублирована, чтобы продемонстрировать, что решение обеспечит выявление не только различных, но и дублированных данных. Сравнение с таблицей EMP дает три строки для служащих 10-го отдела и две строки для служащего WARD. Должно быть получено следующее результирующее множество: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CNT
Решение Функции, осуществляющие вычитание множеств (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,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |