【转】ORA-01427: 单行子查询返回多个行,连表查询去重

article/2025/9/27 22:12:42

转自:http://blog.chinaunix.net/uid-23

实例1

有人问题我一个问题,情况如下:
他要用根据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


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

 

实例2

http://www.bubuko.com/infodetail-2285758.html

如果B表符合条件的记录数大于1条,就会出现1:n的情况,这样left join后的结果,记录数会多于A表的记录数。

例如:member与member_login_log表的结构如下,member记录会员信息,member_login_log记录会员每日的登入记录。member表的id与member_login_log表的uid是对应关系。

member 表

技术分享

 

member_login_log 表

技术分享

 

查询member用户的资料及最后登入日期:
如果直接使用left join

select a.id, a.username, b.logindate
from member as a 
left join member_login_log as b on a.id = b.uid;

因member_login_log符合条件的记录比member表多(a.id = b.uid),所以最后得出的记录为:

技术分享

 

但这并不是我们要的结果,因此这种情况需要保证B表的符合条件的记录是空或唯一,我们可以使用group by来实现。

select a.id, a.username, b.logindate
from member as a 
left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b
on a.id = b.uid;

 

 

 

 

 

select a.id, a.username, b.logindate

from member as 

left join (select uid, max(logindate) as logindate from member_login_log group by uidas b

on a.id = b.uid;

技术分享

技术分享

 

结论2

1、尝试用distinct、max()、group by、分析函数(over()等)等去重

------distinct 去重复查询select * from  accounts acc join (select distinct accid from roles) r on r.accid=acc.ID-----不需要distinct select * from (select MAX(ID)roleid,accid from roles group by accid) rr join (select * from accounts) acc on acc.ID=rr.accid--------解释一下不用distinct 去重复查询语句Select * from (Select max(不重复的字段就行) as roleid,要去重复字段名 From 数据表 Where  条件 Group by   要去重复字段名) as A join 数据库表 on 条件

2、使用left join的两个表,最好是1:1 或 1:0的关系,这样可以保证A表的记录全部显示,B表显示符合条件的记录

 


http://chatgpt.dhexx.cn/article/j8xXtXsu.shtml

相关文章

关于子查询报错返回多行数据

项目场景&#xff1a; 子查询报错返回多行数据 问题描述 在查询数据时有两个功能都在操作同一个表,导致子查询查询数据是报错子查询返回多调数据 原因分析&#xff1a; 我遇到的问题所分析是因为两个功能操作同一个表,将查询条件字段改变了,经查询是该字段本来一对一查询更改…

ORA_01427 单行子查询返回多个行

同事反馈线上生产环境在统计报表数据时报错&#xff0c;测试环境没问题&#xff0c;对比代码相同的情况下&#xff0c;将异常锁定在数据问题上面&#xff0c;于是申请了服务器日志查询&#xff0c;发现了ORA_01427&#xff08;单行子查询返回多个行&#xff09;的报错&#xff…

SQL学习之子查询,基于Oracle下的HR用户(四)

六、 子查询 1 子查询介绍 1.1 什么是子查询 子查询是一个 SELECT 语句&#xff0c;它是嵌在另一个 SELECT 语句中的子句。 可以用组合两个查询的方法解决这个问题&#xff0c;放置一个查询到另一个查询中。内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行…

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

今天sql进行查询时&#xff0c;执行sql语句弹出单行子查询返回多个行的错误提示 经过整改解决了这个问题 1.错误产生原因 原sql语句(为方便理解进行简化)&#xff1a; select * from 表a a where a.name (select b.name from 表b b where b.name 张三 ) 原本想通过&#…

lwl,lwr

lwl,lwr,swl,swr中的指令后缀r(right),l(left)都是相对寄存器而言&#xff0c;load操作是把取到的部分数据&#xff0c;置入寄存器的left或者right&#xff0c;store操作时将寄存器中的数据的 left或者right部分写入目标地址。无论时大端和小端寄存器的格式都是固定的&#xff…

1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授

程序示例–局部加权线性回归 现在&#xff0c;我们在回归中又添加了 JLwr() 方法用于计算预测代价&#xff0c;以及 lwr() 方法用于完成局部加权线性回归&#xff1a; # coding: utf-8 # linear_regression/regression.py# ...def JLwr(theta, X, y, x, c):"""…

LWE和RLWE问题学习

LWE概念 又称误差还原&#xff0c;容错学习问题&#xff0c;即已知一个矩阵 A A A以及一个向量&#xff0c;求解 b ^ A x e \hat{b}A xe b^Axe 这里 e e e是一个固定数值范围内随机采集的一个随机噪音向量&#xff0c;所以这个问题就转化为通过 A A A和 b ^ \hat{b} b^来还…

同态加密简介

同态加密概述 基本概念 同态加密&#xff08;Homomorphic Encryption,HE&#xff09;指将原始数据经过同态加密后&#xff0c;对密文进行特定的运算&#xff0c;得到的密文计算结果在进行同态解密后的得到的明文等价于原始明文数据直接进行相同计算所得到的数据结果。 历史与…

机器学习笔记(一)-局部加权回归(Locally weighted regression)LWR

在网上通过看斯坦福大学的机器学习课程&#xff0c;觉得讲的非常好。同时&#xff0c;为了加强自己的记忆&#xff0c;决定将自己学到的东西和一些理解记录下来&#xff0c;希望有所收获。废话不多说&#xff0c;直接开始笔记&#xff1a; 局部加权回归&#xff08;locally we…

ROS中7自由度机械臂自定义发布订阅节点

本篇用来记录一次作业的学习例程&#xff0c;错误之处敬请谅解&#xff0c;后续修改 作业要求&#xff1a; 写两个ROS节点&#xff0c;一个节点发布连续变化&#xff08;可以按sin曲线变化&#xff09;的7自由度的关节角信息&#xff1b;另一个节点订阅第一个节点发布的关节角…

【自己动手写CPU】加载存储指令的实现

目标 修改之前一直做测试的sopc&#xff0c;为其添加数据RAM&#xff0c;测试一般加载指令的实现&#xff0c;加入特殊加载存储指令。 探讨由于加载指令引起的load相关问题&#xff0c;给出OpenMIPS的解决方法&#xff0c;验证解决效果。 加载存储指令说明 31-2625-2120-161…

自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

将陆续上传新书《自己动手写CPU》。今天是第38篇&#xff0c;我尽量每周四篇&#xff0c;可是近期已经非常久没有实现这个目标了。一直都有事&#xff0c;不好意思哈。 开展晒书评送书活动&#xff0c;在亚马逊、京东、当当三大图书站点上&#xff0c;发表《自己动手写CPU》书评…

LWR--local weighted regression

转自http://www.cnblogs.com/jeromeblog/p/3396486.html 简单回顾一下线性回归。我们使用了如下变量&#xff1a; x —输入变量/特征&#xff1b; y —目标变量&#xff1b; (x,y) —单个训练样本&#xff1b; m —训练集中的样本数目&#xff1b; n —特征维度&#xff1b; (x…

局部加权回归(LWR) Matlab模板

将百度文库上一份局部加权回归的代码&#xff0c;将其改为模板以便复用。 q2x,q2y为数据集&#xff0c;是n*1的矩阵&#xff1b; r是波长参数&#xff0c;就是对于距离的惩罚力度&#xff1b; q_x是要拟合的数据横坐标&#xff0c;是1*n的矩阵&#xff1b; 得到的q_y即为所求坐…

自己动手写CPU之第九阶段(2)——加载存储指令说明2(lwl、lwr)

将陆续上传新书《自己动手写CPU》&#xff0c;今天是第38篇&#xff0c;我尽量每周四篇&#xff0c;但是最近已经很久没有实现这个目标了&#xff0c;一直都有事&#xff0c;不好意思哈。 开展晒书评送书活动&#xff0c;在亚马逊、京东、当当三大图书网站上&#xff0c;发表…

1.3 欠/过拟合,局部加权回归(Loess/LWR)及Python实现(基于随机梯度下降)

import numpy as np import matplotlib.pyplot as plt #定义一个正态分布&#xff0c;参数分别为均值&#xff0c;方差以及X的行向量 def guassianDistribution(mean,var,x):return 1/np.sqrt( 2 * np.pi * var )*np.exp( - (x[1]-mean) ** 2 / (2*var) ) #定义权值计算函数&am…

ubuntu18.04 编译rtt-lwr

https://rtt-lwr.readthedocs.io/en/latest/install/install-18.04-melodic.html 一路通过。 coundt find AF_INET address #4 Open roboticsai opened this issue on Mar 22, 2018 2 comments Comments roboticsai commented on Mar 22, 2018 after i run the rttlua-gnu…

LWR服务管理框架

详细接口文档地址:https://www.showdoc.cc/lwr2 目前支持微信版本&#xff1a;最新版。 主要介绍开发接口 2.0暂时支持tcp和http开发&#xff0c;两者传输json数据是一样的。如下介绍&#xff1a; 1.请求Lwr框架的数据内容如下 {"serverKey": "软件上设置的…

基于物理信息深度学习的交通状态估计:以LWR和CTM模型为例

1.文章信息 本次介绍的文章是2022年发表在IEEE Open Journal of Intelligent Transportation Systems的一篇名为《Physics-Informed Deep Learning for Traffic State Estimation: Illustrations With LWR and CTM Models》的文章&#xff0c;该文章应用物理信息深度学习方法估…

机器学习实战--局部加权线性回归(LWR)

一 概述 通常情况下的线性拟合不能很好地预测所有的值&#xff0c;因为它容易导致欠拟合&#xff08;under fitting&#xff09;&#xff0c;比如数据集是 一个钟形的曲线。而多项式拟合能拟合所有数据&#xff0c;但是在预测新样本的时候又会变得很糟糕&#xff0c;因为它导…