zoukankan      html  css  js  c++  java
  • oracle ORA-01427: 单行子查询返回多个行

    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

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

  • 相关阅读:
    Facebook发布神经蛋分离法,可从嘈杂环境中提取音视频
    前线观察 | AWS re:Invent 2018见闻实录
    SSO
    8-5 Navicat工具与pymysql模块
    saltstack
    nginx 集群介绍
    Docker 持久化存储
    Docker 多机网络
    《深入理解JAVA虚拟机》笔记1
    jquery 学习日记之选择器
  • 原文地址:https://www.cnblogs.com/bolang100/p/6201799.html
Copyright © 2011-2022 走看看