使用Oracle中同一个表中的其他行数据更新一行

时间:2015-03-17 19:34:51

标签: sql database oracle

我有一个包含90列的表格,并且我希望使用该特定组的最前面记录中的值更新/插入Null列。

例如: 我必须使用前一条记录中的所有非空值更新 ID = 8 的空列(ID_PK Ascending)如果前面的记录为null,则为下一个前面的记录,依此类推。

对于 Grp2 ,同样更新 ID = 15 的记录,其中记录前面的那个组等等......

麻烦的是我要检查和更新大约90列。是否有任何特殊的方法,而不是挑出每一列并检查以前的记录值。

感谢您查看此问题。

以下是该表的子集

   Group   ID_PK  TAX   REASON     DT      TYPE   FLG
  =====  ======  ====  =======  =======    ====   ===

   Grp1     2              1     6/30/2013  SD     N
   Grp1     3     18813    1                MEM      
   Grp1     5              1                SDHC   N
   Grp1     8                               NOR 

   Grp2     9     12713    3     5/20/2014  SDHC   Y
   Grp2     11                              NOR    N
   Grp2     15    12713             

2 个答案:

答案 0 :(得分:0)

我没有oracle数据库实例来确认100%这是有效的,但你可能正在寻找的功能是滞后()

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions070.htm

您遇到的问题是,您需要延迟返回不同的行数,具体取决于在空值之前需要遍历的记录数。你可以编写一个很长的CASE语句,它可以工作,但是不是最佳的。但是,lag()将成为你想要的。

答案 1 :(得分:0)

SELECT last_name, hire_date, salary,
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal
FROM employees
WHERE job_id = 'PU_CLERK';

LAST_NAME                 HIRE_DATE     SALARY   PREV_SAL
------------------------- --------- ---------- ----------
Khoo                      18-MAY-95       3100          0
Tobias                    24-JUL-97       2800       3100
Baida                     24-DEC-97       2900       2800
Himuro                    15-NOV-98       2600       2900
Colmenares                10-AUG-99       2500       2600

LAG是一种分析功能。它可以在没有自联接的情况下同时访问表的多个行。给定从查询返回的一系列行和光标的位置,LAG提供对该位置之前给定物理偏移处的行的访问。