当前位置: 代码迷 >> Oracle管理 >> update 与 lag函数解决办法
  详细解决方案

update 与 lag函数解决办法

热度:125   发布时间:2016-04-24 04:14:46.0
update 与 lag函数

SELECT * FROM EMP;
CREATE TABLE t AS SELECT * FROM emp WHERE 1=2;
INSERT INTO t(empno) SELECT empno FROM emp;
SELECT EMPNO, SAL FROM T ORDER BY HIREDATE;

--嵌套两次
UPDATE T
   SET SAL =
       (SELECT EN
          FROM (SELECT EMPNO, LAG(EMPNO, 1, 0) OVER(ORDER BY HIREDATE) EN
                  FROM EMP) TMP
         WHERE TMP.EMPNO = T.EMPNO)
 WHERE T.EMPNO > 7788;

SELECT EMPNO, SAL FROM T ORDER BY HIREDATE;
 empno        sal
------              -----------
7369
7499
7521
7566
7654
7698
7934 7902.00
7788
7839 7654.00
7844 7782.00
7876 7788.00
7900 7839.00
7902 7900.00
7782

--嵌套一次
UPDATE T
   SET SAL =
       (SELECT LAG(EMPNO, 1, 0) OVER(ORDER BY HIREDATE) EN
          FROM EMP
         WHERE EMP.EMPNO = T.EMPNO)
 WHERE T.EMPNO > 7788;

SELECT EMPNO, SAL FROM T ORDER BY HIREDATE;
 empno  sal
    ------     --------
  7369
  7499
  7521
  7566
  7654
  7698
  7934 0.00
  7788
  7839 0.00
  7844 0.00
  7876 0.00
  7900 0.00
  7902 0.00
  7782

问题是,嵌套一次的update语句更新后 ,sal的值为0呢???

update语句不能直接用lag函数么?
------解决方案--------------------
引用:


UPDATE T
   SET SAL =
       (SELECT LAG(EMPNO, 1, 0) OVER(ORDER BY HIREDATE) EN
          FROM EMP
         WHERE EMP.EMPNO = T.EMPNO)
 WHERE T.EMPNO > 7788;

当你WHERE EMP.EMPNO = T.EMPNO加上这个条件的时候其实每次只要一条记录,一条记录再用LAG函数处理,这条唯一的记录的不存在上下相邻的条记录。
所以。。。。
  相关解决方案