|
Программирование >> Преобразование значений null
Требуется увеличить все значения столбца SAL на 10%. Решение Для изменения существующих строк таблицы базы данных используйте выражение UPDATE (обновить). Например: 1 update emp 2 set sal = sal*1.10 3 where deptno = 20 Обсуждение Используйте выражение UPDATE с предикатом WHERE, чтобы указать, какие строки подлежат обновлению. Если опустить предикат WHERE, обновлены будут все строки. Выражение SAL*1.10 в данном решении возвращает заработную плату, увеличенную на 10%. При подготовке к масштабным обновлениям может потребоваться предварительно просмотреть результаты. Сделать это можно, создав выражение SELECT, включающее выражения, которые планируется поместить в операторы SET. Следующее выражение SELECT показывает результат повышения зарплаты на 10%: select deptno, ename, sal as orig sal, sal*.10 as amt to add, sal*1.10 as new sal from emp where deptno=20 order by 1,5 DEPTNO ENAME ORIG SAL AMT TO ADD NEW SAL
Результат повышения заработной платы представлен в двух столбцах: в одном показана сумма, на которую была повышена заработная плата, а во втором - новая заработная плата. 7369 SMITH 7900 JAMES 7934 MILLER Решение Чтобы найти в EMP служащих, которые есть в таблице EMP BONUS, используйте подзапрос в предикате WHERE выражения UPDATE. Тогда выражение UPDATE будет применено только к строкам, возвращенным подзапросом, что обеспечит возможность увеличить заработную плату соответствующим работникам: 1 update emp 2 set sal=sal*1.20 3 where empno in ( select empno from emp bonus ) Обсуждение В результате подзапроса возвращаются строки, которые будут обновлены в таблице EMP. Предикат IN проверяет, есть ли значения столбца EMPNO таблицы EMP среди значений EMPNO, возвращенных запросом. Если он находит такое значение, обновляется соответствующее ему значение столбца SAL. В качестве альтернативы вместо IN можно использовать EXISTS: update emp set sal = sal*1.20 where exists ( select null from emp bonus where emp.empno=emp bonus.empno ) Может вызвать удивление присутствие значения NULL в списке SELECT подзапроса EXISTS. Ничего страшного, этот NULL не оказывает неблагоприятного эффекта на обновление. По-моему, он делает код бо- Обновление в случае существования соответствующих строк в другой таблице Задача Требуется обновить строки одной таблицы, только если соответствующие строки существуют в другой таблице. Например, если данные о служащем имеются в таблице EMP BONUS, его заработная плата (данные о которой хранятся в таблице EMP) должна повыситься на 20%. Следующее результирующее множество представляет данные, имеющиеся в настоящий момент в таблице EMP BONUS: select empno, ename from emp bonus EMPNO ENAME 10 4000 Столбец DEPTNO - это первичный ключ таблицы NEW SAL. Требуется обновить заработные платы и комиссионные определенных служащих в таблице EMP, используя значения таблицы NEW SAL. Если значения столбцов EMP.DEPTNO и NEW SAL.DEPTNO совпадают, то значение EMP.SAL обновляется значением NEW SAL.SAL, а значение столбца EMP.COMM увеличивается на 50% от значения NEW SAL.SAL. Вот строки таблицы EMP:
лее понятным, поскольку подчеркивает тот факт, что в отличие от решения с использованием подзапроса с оператором IN условие обновления (т. е. какие строки будут обновлены) будет контролироваться предикатом WHERE подзапроса, а не значениями, возвращенными как результат списка SELECT подзапроса. Обновление значениями из другой таблицы Задача Требуется обновить строки одной таблицы, используя значения другой таблицы. Например, имеется таблица NEW SAL, в которой хранятся новые размеры заработных плат определенных служащих. Содержимое таблицы NEW SAL: select * from new sal DEPTNO SAL
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |