Как увеличить значение каждого столбца SAL на 100 (100, 200, 300, ... и т. Д.)? - PullRequest
1 голос
/ 15 октября 2019

У меня есть задача, где мне нужно увеличить значение каждой строки в «SAL» на 100. Начиная с первой записи и до последней.

Я написал код, чтобы выбрать правильныйзаписей и отсортировали их, но не могу найти способ увеличить значения столбца 'SAL'. Я использую https://livesql.oracle.com/ песочницу, чтобы попытаться выучить SQL

SELECT ROWNUM, T1.*, T2.DNAME, T2.LOC
FROM SCOTT.EMP  T1, SCOTT.DEPT T2 
WHERE T1.DEPTNO = T2.DEPTNO
AND DNAME = 'SALES'
AND JOB NOT LIKE 'MANAGER'
ORDER BY HIREDATE DESC

Последняя строка не работает

SET SAL = SAL + (ROWNUM * 100)

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

ROWNUM с ORDER BY может привести к неожиданным результатам, поскольку они генерируются до ORDER BY на этапах обработки инструкции SELECT. Поэтому для операции UPDATE предпочитайте использовать функцию ROW_NUMBER() (UPDATE через встроенное представление не должно содержать аналитической функции, такой как ROW_NUMBER(). В результате вы не можете использовать свой текущий метод, но используйте тот, что ниже):

UPDATE EMP e 
   SET e.SAL = nvl(e.SAL,0) + 
               (
                SELECT SAL_ADD 
                  FROM
                  ( SELECT 100 * ROW_NUMBER() OVER (ORDER BY HIREDATE DESC) as SAL_ADD, 
                           T1.EMPNO 
                      FROM EMP T1
                      JOIN DEPT T2
                        ON T1.DEPTNO = T2.DEPTNO
                     WHERE DNAME = 'SALES'
                       AND JOB NOT LIKE 'MANAGER'
                    ) tt
                 WHERE e.EMPNO = tt.EMPNO );

Демо

0 голосов
/ 15 октября 2019

Оу! Этот ответ принят, но позвольте мне еще об этом подумать - MERGE INTO

MERGE INTO SCOTT.EMP  T11
USING (SELECT T1.EMPNO , ROW_NUMBER() OVER (ORDER BY T1.HIREDATE DESC) as RN
         FROM SCOTT.EMP  T1 JOIN SCOTT.DEPT T2 
          ON (T1.DEPTNO = T2.DEPTNO)
       WHERE DNAME = 'SALES'
         AND JOB NOT LIKE 'MANAGER') T22
ON (T11.EMPNO = T22.EMPNO)
WHEN MATCHED THEN
UPDATE SET T11.SAL = T11.SAL + (RN*100);

Ура !!

0 голосов
/ 15 октября 2019

Как насчет этого?

UPDATE (
   SELECT ROWNUM AS R, T1.*, T2.DNAME, T2.LOC
   FROM SCOTT.EMP  T1
      JOIN SCOTT.DEPT T2 ON T1.DEPTNO = T2.DEPTNO
   WHERE DNAME = 'SALES'
      AND JOB NOT LIKE 'MANAGER'
   ORDER BY HIREDATE DESC)
SET SAL = SAL + (R * 100);

Вместо ROWNUM AS R вы также можете использовать ROW_NUMBER() OVER (ORDER BY HIREDATE DESC) AS R (тогда вам не нужно ORDER BY HIREDATE DESC)

...