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

1 ... 30 31 32 [ 33 ] 34 35 36 ... 219


where

deptno = 20

order

by 1,3

DEPTNO

ENAME

SMITH

ADAMS

1100

JONES

2975

SCOTT

3000

FORD

3000

Требуется увеличить все значения столбца 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

SMITH

ADAMS

1100

1210

JONES

2975

3273

SCOTT

3000

3300

FORD

3000

3300

Результат повышения заработной платы представлен в двух столбцах: в одном показана сумма, на которую была повышена заработная плата, а во втором - новая заработная плата.



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:

select

deptno,ename,sal,comm

from

order

by 1

DEPTNO

ENAME

COMM

CLARK

2450

KING

5000

MILLER

1300

SMITH

ADAMS

1100

FORD

3000

SCOTT

3000

JONES

2975

ALLEN

1600

BLAKE

2850

MARTIN

1250

1400

JAMES

TURNER

1500

WARD

1250

лее понятным, поскольку подчеркивает тот факт, что в отличие от решения с использованием подзапроса с оператором IN условие обновления (т. е. какие строки будут обновлены) будет контролироваться предикатом WHERE подзапроса, а не значениями, возвращенными как результат списка SELECT подзапроса.

Обновление значениями из другой таблицы Задача

Требуется обновить строки одной таблицы, используя значения другой таблицы. Например, имеется таблица NEW SAL, в которой хранятся новые размеры заработных плат определенных служащих. Содержимое таблицы NEW SAL:

select * from new sal

DEPTNO SAL



1 ... 30 31 32 [ 33 ] 34 35 36 ... 219

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