用 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中,如何在一张表插入数据,使得插入数据的某些字段为其他表中的数据