跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢相关的知识,希望对你有一定的参考价值。

如题:org_info 表内容如下:
ID NAME TEL ADDR OP_TYPE OCCUR_DATE
1001 aaa 888888 ppppppp 2014-07-23
1001 aaa 999999 ppppppp 2011-03-19
1002 bbb 666666 yyyyyyy 2014-09-15
1002 ipow 221 fghfghfh 2009-07-08
1002 ipow 221 iyyiwqwe 2006-02-24
1002 bbb 666666 yyyyyyy 2001-05-12

update (select row_number() over(partition by id order by occur_date ASC) RN,
oi.* from org_info oi) aa
set aa.op_type = 1 where aa.RN = 1
数据库报错:
ORA-01732: 此视图的数据操纵操作非法

请问这为什么错?如果不能这样写,那么用什么方式还能实现此功能呢?谢谢~~~~
(希望实现按照ID分组,取出日期最小的那条记录,将他字段OP_TYPE更新为1,求指导啊~~~)

如果是日期最小的记录,可以直接用min。

update org_info
   set op_type = 1
 where occur_date in (select min(occur_date) from org_info group by id)

追问

这样不行啊,按照id分组后,如果第一组数据最小的日期是1月1号,此外第二组最小的日期是1月10号,但是第二组数据中刚好有一条数据也是1月1号,那岂不是把这也更新了?

追答

update org_info
set op_type = 1
where (occur_date,id) in (select min(occur_date),id from org_info group by id)

参考技术A 需要分布执行。plsql写即可。追问

能否具体写一下啊?
谢谢

追答

定义个 游标=select row_number() over(partition by id order by occur_date ASC

然后循环游标 ,逐个更新 ,具体语法百度吧。

mysql:update select groupby orderby(分组排序后更新第一条数据)

参考技术A

有时候我们需要更新table中分组排序后的第一条数据。比如:给各学科分数第一名的学生打标。

如上图所示,现在有一张学生成绩表,我想要各科第一名的学生打标,也就是向mark字段中写入“第一名”标记。那么预想得到的效果应该是这样的:

由于需要使用到group by , 所以需要先检查下mysql对应的sql_mode 是否包含 ONLY_FULL_GROUP_BY ,如果包含,则将sql_mode中的ONLY_FULL_GROUP_BY移除掉,否则下面的SQL可能执行不成功

上面sql中t0表为什么需要使用到DISTINCT,可以查看文章:

执行结果:

SQL分析:

上面的SQL感觉还是过于复杂了,看过下面的文章后:

可以将上面的SQL优化优化.....

优化版写法:

执行结果:

SQL分析:

执行结果:

SQL分析:

上面的SQL中使用到了窗口函数,关于窗口函数相关文章:

以上是关于跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢的主要内容,如果未能解决你的问题,请参考以下文章

mysql:update select groupby orderby(分组排序后更新第一条数据)

Oracle 学习第四篇

oracle 数据库用update 语句更新无效。

oracle数据库如何用update批量更新某列数据中的字段

oracle数据库如何用update批量更新某列数据中的字段

oracle数据库字段内容如何批量替换?