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

前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因。
java.sql.SQLException: ORA-01427: single-row subquery returns more than one row
我一看到这个错误的第一反应就是应该是sql语句的问题,然后开发同事反馈这个程序已经用了蛮长时间了,现在突然报出了错误。
 简单沟通之后,我得到了对应的sql语句。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER ,
 (SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey ) KEYNAME
 FROM app_iwork.WS_TEST_PROJECT pro
 WHERE TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
从sql语句能够猜出来错误应该是从子查询里返回的。
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey )
我们来看看这个语句,按照ORA-01427的错误,应该是这个子查询返回了多行值。
 简单来验证一下,首先根据type='495'能够得到下面的查询结果
select projectkey from app_iwork.WS_TEST_PROJECT pro WHERE TYPE = '495'
 PROJECTKEY
 --------------------------------------------------
 1557739
 1516023
 1577799
 374871
 1584374

取出任意一条,然后按照两个表的关联字段值查询,可以看到输出了3行数据。
SQL> SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = 1557739;
 NAME
 --------------------------------------------------------------------------------
分析系统
 分析系统
 分析系统
 所以这种情况的解决方案有几种。

--推测子查询中肯定有返回多行的情况,试着在子查询中加入rownum<2,也就是限制返回一行数据。成功!或
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER , n.name
 FROM app_iwork.WS_TEST_PROJECT pro ,app_iwork.WS_PRIVILEGE_NODE n
 WHERE MENUID = pro.projectkey and TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
这种方式可以输出结果而不会报错,尽管存在冗余数据,但是也不推荐。
 另外一种思路就是在子查询中进行重复值的过滤,使用group by来完成。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER ,
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey group by name ) KEYNAME
FROM app_iwork.WS_TEST_PROJECT pro
WHERE TYPE = '495' ORDER BY LOCATION ASC ,ID DESC

还有一种思路就是和开发确认,删除冗余的数据,这种方案不用修改代码,还是相对来说可以实现的一种方式。
 和开发同事简单沟通,这个表中还是存在部分的脏数据,修改之后,问题就解决了。
 如果对这个问题进一步改进,可以在确认这个表结构的基础上,看看能够添加相应的约束,这样也能够保证表中的数据不会存在冗余,避免后续出现此类的问题。

oracle ORA-01427: 单行子查询返回多个行的更多相关文章

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

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

  2. occal [问题解决]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. .Net程序员学用Oracle系列(14):子查询、集合查询

    1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY ...

  5. Oracle 自连接 / 外连接 / 子查询

    --连接查询的三种格式 select ename, deptno,dname from emp natural join dept; select ename, deptno,dname from e ...

  6. Oracle学习(六):子查询

    1.知识点:能够对比以下的录屏进行阅读 SQL> --子查询所要解决的问题:问题不能一步求解 SQL> --查询工资比SCOTT高的员工信息 SQL> --(1)使用普通方法 SQL ...

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

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

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

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

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

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

随机推荐

  1. java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  2. eclipse项目debug方法

    属性查看代码在哪里存 本地项目启动 1,2步骤需要success

  3. 问题解决_WCF_WCF 接收我服务的 HTTP 响应时发生错误

    原文地址:http://www.cnblogs.com/tianma3798/p/5470974.html 错误内容: System.ServiceModel.CommunicationExcepti ...

  4. nodejs + ionic2 + cordova环境搭建

    1.nodejs 下载地址:https://nodejs.org/zh-cn/,执行默认安装就可以,可执行命令 node(环境变量) 2.修改 npm 源,执行:npm config set regi ...

  5. 编译安装带ssl 模块指定版本Python

      出现这个或者fatal error: openssl/名单.h: No such file or directory.都是没有安装libssl-dev- libssl-dev包含libraries ...

  6. ionic 里使用 iframe 可能遇到的问题

    无法访问外部url的问题--两个步骤解决: iframe的src属性用ng-src属性替代,并指明绑定对象: ng-src="{{targetUrl}}" 在controller里 ...

  7. 在亚马逊amazon的AWS上安装Node和MongoDB服务器

    在亚马逊amazon的AWS上安装Node和MongoDB服务器 在建立AWS上账号.创建EC2 ,用putty链接上之后,就可以用下面的方法开始安装. !!! 如果不是是自己建立的EC2, 而是由B ...

  8. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  9. Sublime Text 3 使用

    Sublime Text3使用 下载安装 参考:http://www.downza.cn/soft/187996.html Sublime Text Build 3126 x64 Setup.exe下 ...

  10. C学习笔记

    1.struct struct 是一种复合数据类型,其构成元素可以是一些复合数据类型,如array,struct,union,缺省情况下,编译器为结构体的每个成员按其自然对齐(默认对齐,按照结构体成员 ...