怎样一次用不同的值更改多条数据?

[复制链接]
查看11 | 回复9 | 2012-6-20 17:38:14 | 显示全部楼层 |阅读模式
呵呵,不好意思,又有问题要请教大家了;
下面的SQL语句:
update tpa_mss_ho_sum_kpi a SET(succinc3gho2gintermsc,succ3gho2gintramsc,attinc3gho2gintermsc,att3gho2gintramsc)
=(SELECT b.succinc3gho2gintermsc,b.succ3gho2gintramsc,b.attinc3gho2gintermsc,b.att3gho2gintramsc
FROM tpa_mss_ho_sum_kpi b
WHERE first_result=to_char((sysdate-2)-3/24,'yyyy-mm-dd hh24:')||'00:00'
AND ne_type IN (100,1000,10000) )
WHERE exists
(select 1
from tpa_mss_ho_sum_kpi b
WHERE ne_type IN (100,1000,10000)
AND (a.record_id=b.record_id AND a.s_month=b.s_month)
AND first_result=to_char(SYSDATE-3/24,'yyyy-mm-dd hh24:')||'00:00');
上面的sql语句,紫色部分和红色部分每次都会取出多条数据。
每次执行这个语句都报错:ora-01427:单行子查询返回多于一个行。
我现在想,如果这两部分的数据量一致的话(比如都是100条数据),怎么样让它一一对应起来去UPDATE?
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
merge or pl/sql
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
我就是在PL/SQL里执行的,不知道怎么弄了。
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
原帖由 听海★蓝心梦 于 2009-5-8 16:41 发表
呵呵,不好意思,又有问题要请教大家了;
下面的SQL语句:
update tpa_mss_ho_sum_kpi a SET(succinc3gho2gintermsc,succ3gho2gintramsc,attinc3gho2gintermsc,att3gho2gintramsc)
=(SELECT b.succinc3gho2gintermsc,b.succ3gho2gintramsc,b.attinc3gho2gintermsc,b.att3gho2gintramsc
FROM tpa_mss_ho_sum_kpi b
WHERE first_result=to_char((sysdate-2)-3/24,'yyyy-mm-dd hh24:')||'00:00'
AND ne_type IN (100,1000,10000) )
WHERE exists
(select 1
from tpa_mss_ho_sum_kpi b
WHERE ne_type IN (100,1000,10000)
AND (a.record_id=b.record_id AND a.s_month=b.s_month)
AND first_result=to_char(SYSDATE-3/24,'yyyy-mm-dd hh24:')||'00:00');
上面的sql语句,紫色部分和红色部分每次都会取出多条数据。
每次执行这个语句都报错:ora-01427:单行子查询返回多于一个行。
我现在想,如果这两部分的数据量一致的话(比如都是100条数据),怎么样让它一一对应起来去UPDATE?

你得和数据库说清楚,你想用哪条记录来作修改指.否,修改一条记录,给10个记录值,你让ORACLE选哪条值来修改?
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
假如红色部分和紫色部分都取出10条数据,让它们自动按照顺序,一条一条对应修改,可以吧?
其实我加:AND (a.record_id=b.record_id AND a.s_month=b.s_month)
就是想让它们按照这两个字段来对应起来修改,这两个字段相等的就update。
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
原帖由 听海★蓝心梦 于 2009-5-8 16:47 发表
我就是在PL/SQL里执行的,不知道怎么弄了。

ZALBB说得好。你在PL/SQL里用游标和循环,找到一组值,然后去update一条匹配的记录。
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
刚才“油菜”说的merge 是什么意思啊?
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
最初是用游标来实现的,可是这样的话过程中要用到5个游标循环,性能很低。同事说他有个这样的语句,可我怎么改都不能实现自己想要的效果。
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
原帖由 听海★蓝心梦 于 2009-5-8 17:02 发表
最初是用游标来实现的,可是这样的话过程中要用到5个游标循环,性能很低。同事说他有个这样的语句,可我怎么改都不能实现自己想要的效果。

想想,为什么游标可以执行成功,而你的语句却不成?
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
原帖由 听海★蓝心梦 于 2009-5-8 16:58 发表
刚才“油菜”说的merge 是什么意思啊?

如果(a.record_id=b.record_id AND a.s_month=b.s_month)条件能返回一一对应的值,就可以用merge
merge intoa
using b on a.record_id=b.record_id AND a.s_month=b.s_month)
when MATCHED then
update a set ...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行