有人问题我一个问题,情况如下:
他要用根据divide_act_channel_day的new_amount字段去更新divide_stat的new_amount字段。
两张表关联的条件:day=log_time,channel=channel

--SQL如下:
update divide_stat 
set divide_stat.new_amount=(select divide_act_channel_day.new_amount from divide_act_channel_day
where divide_stat.day=divide_act_channel_day.log_time 
and divide_stat.channel=divide_act_channel_day.channel 
);

SQL 错误: ORA-01427: 单行子查询返回多个行
01427. 00000 -  "single-row subquery returns more than one row"

--推测子查询中肯定有返回多行的情况,试着在子查询中加入rownum<2,也就是限制返回一行数据。成功!
update divide_stat 
set divide_stat.new_amount=(select divide_act_channel_day.new_amount from divide_act_channel_day
where divide_stat.day=divide_act_channel_day.log_time 
and divide_stat.channel=divide_act_channel_day.channel and rownum<2);

--找出divide_act_channel_day表重复行。有9行重复。
select * from 
(
select count(*) total,log_time,channel  from divide_act_channel_day
group by log_time, channel
)
where total>1;

TOTAL                  LOG_TIME                  CHANNEL                                            
---------------------- ------------------------- -------------------------------------------------- 
2                      2012-12-12 00:00:00       0                                                  
2                      2012-12-13 00:00:00       0                                                  
2                      2013-01-07 00:00:00       0                                                  
2                      2012-12-15 00:00:00       0                                                  
2                      2012-12-01 00:00:00       0                                                  
2                      2012-12-31 00:00:00       0                                                  
2                      2012-12-04 00:00:00       0                                                  
2                      2012-12-23 00:00:00       0                                                  
2                      2012-12-21 00:00:00       0

9 所选行

--观察divide_act_channel_day表,发现它根本没有重复行。看来是where条件精度不够造成的行重复。

--观察divide_act_channel_day和divide_stat两张表,发现它们还有可以关联的列:amount和NEW_USER_AMOUNT。
--这样就没有重复行了。
select * from 
(
select count(*) total,log_time,channel,amount,NEW_USER_AMOUNT  from divide_act_channel_day
group by log_time, channel, amount, NEW_USER_AMOUNT
)
where total>1;

no rows selected

--修改upadte语句
update divide_stat 
set divide_stat.new_amount=(select divide_act_channel_day.new_amount from divide_act_channel_day 
where divide_stat.day=divide_act_channel_day.log_time 
and divide_stat.channel=divide_act_channel_day.channel and  divide_stat.amount=divide_act_channel_day.amount
and  divide_stat.NEW_USER_AMOUNT=divide_act_channel_day.NEW_USER_AMOUNT);

结论:
1.根据A表的某列去update B表的某列时,一定要找出A B两张表可以关联的所有字段,这样基本上不会出现"ORA-01427: 单行子查询返回多个行";
2.如果A表中真的有重复行,那就加上rownum<2条件解决。

occal [问题解决]ORA-01427: 单行子查询返回多个行的更多相关文章

  1. oracle ORA-01427: 单行子查询返回多个行

    ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...

  2. ORA-01427: 单行子查询返回多个行

    有人问题我一个问题,情况如下:他要用根据divide_act_channel_day的new_amount字段去更新divide_stat的new_amount字段.两张表关联的条件:day=log_ ...

  3. oracle[insert 时报错: 单行子查询返回多行]

    -- 错误的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_id) (seq_t_b_partner_vehicle.nextva ...

  4. Sql中联合查询中的”子查询返回的值不止一个“的问题

    在子查询中,如果想实现如下的功能: select lib,count(*),select sum(newsNo) from Table1 group by lib from Tabel1 T1,Tab ...

  5. MYSQL 子查询返回多列显示

    因工作需要,目前研究出一种mysql 技能,与大家分享一下. 需求:关联查询另一个大表数据的某些(一个以上)字段 方案:因关联查询的表数据太大.多表查询影响效率,单个子查询又有些多余.所以采用多列拼接 ...

  6. SQL server 查询出现:---“子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”SQL查询错误解析---

    最近用select进行数据筛选,碰到下面的这个错误: ---子查询返回的值不止一个.当子查询跟随在 =.!=.<.<=.>.>= 之后,或子查询用作表达式时,这种情况是不允许的 ...

  7. “子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”SQL查询错误解析

    为了实现下述代码,首先得有数据库和相应的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用链接中那些 ...

  8. a.WHERE使用中单行子查询(适用于>,<,=,>=,<=等条件)

    a.单行子查询(适用于>,<,=,>=,<=等条件)    //查询工资最高的员工编号和员工名   select empno,ename   from emp   where ...

  9. insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"

    目录 1.事故现场 1.1 在使用 Insert into Table2 select * from Table1 将表1的数据插入到表2时,报错如下: 1.2 sql 语句 2.推测 3.解决方案 ...

随机推荐

  1. js判断是否ie浏览器或者浏览器版本

    var Sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ua.match(/rv:([\d.]+)\) like g ...

  2. python开源项目Scrapy抓取文件乱码解决

    scrapy进行页面抓去的时候,保存的文件出现乱码,经过分析是编码的原因,只需要把编码转换为utf-8即可,代码片段 ...... import chardet ......         cont ...

  3. pip 18.1 官方文档翻译

    快速开始 从pypi上安装一个包 $ pip install SomePackage 查看安装的包里面包含什么文件 pip show --files SomePackage 查看已经安装的包里面哪些是 ...

  4. restful返回 json数据的JavaBean设计01

    public class ResponseEntity implements Serializable { private int errCode; private String message; p ...

  5. java-tip-关于StringBuilder的使用

    当我们需要拼接字符串时,通常会使用StringBuilder,这里简单分析下StringBuilder的内部结构. StringBuilder内部是一个char数组,当调用append方法连接字符串时 ...

  6. Tomcat安装 以Linux 分支 Ubuntu Server 为例

    以Linux 分支 Ubuntu Server 为例.一.相关目录及作用说明 /etc/tomcat6 - 全局配置 /usr/share/tomcat6/ - 程序主目录 /usr/share/to ...

  7. 16进制颜色转普通RGB

    做开发的会遇到很多时候UI给到的是16进制的颜色  然而很多时候我们需要把它转换成适合我们方法的RGB参数  当然通过网页转换也可以达到目的 但是我现在选择写一个分类来解决  一劳永逸~ 1.首先说下 ...

  8. 更改IDEA高亮字体背景颜色

    IDEA工具中依次进入file -> settings -> editor -> colors Scheme -> general,在右侧窗口中将result.i  都改成自己 ...

  9. 集合_java集合框架

    转载自http://blog.csdn.net/zsw101259/article/details/7570033 Java集合框架图 简化图: Java平台提供了一个全新的集合框架.“集合框架”主要 ...

  10. line1: 1: Syntax error: word unexpected (expecting ")")

    行时错误:line1: 1: Syntax error: word unexpected (expecting ")") 查看Makefile编译规则,可能由于依赖关系造成编译器使 ...