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

Posted

技术标签:

【中文标题】用 Oracle 中同一张表中的其他行数据更新一行【英文标题】:Update one row with other row data from same table in Oracle 【发布时间】:2015-03-17 19:34:51 【问题描述】:

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

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

对于 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             

【问题讨论】:

【参考方案1】:

我没有一个 oracle 数据库实例来确认 100% 这有效,但您可能正在寻找的函数是 lag()

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

您的问题是您需要延迟返回不同数量的行,具体取决于在空值之前需要遍历多少条记录。您可以编写一个非常长的 CASE 语句,它会起作用,但不是最佳的。但是,lag() 将是你想要的。

【讨论】:

感谢您的输入,是的,我可以尝试使用滞后或一些动态 SQL 来解析每一列和每一行。但我在想是否有一种方法可以比较一组非空值该组中的行。不过谢谢你的回复。【参考方案2】:
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 提供对该位置之前给定物理偏移量的行的访问。

【讨论】:

感谢您提供的信息。我将尝试将其合并到动态 sql 中 投票,让每个人都知道哪些答案对你有帮助,谢谢。

以上是关于用 Oracle 中同一张表中的其他行数据更新一行的主要内容,如果未能解决你的问题,请参考以下文章

oracle中,如何在一张表插入数据,使得插入数据的某些字段为其他表中的数据

同一张表中的行之间的差异(Oracle SQL)

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

sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据

在oracle中怎么把一张表的数据插入到另一张表中

Oracle简单总结