Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单行子查询返回多行_Java_Sql_Oracle_Spring Mvc - Fatal编程技术网

Java 单行子查询返回多行

Java 单行子查询返回多行,java,sql,oracle,spring-mvc,Java,Sql,Oracle,Spring Mvc,我编写了一个SQL查询来更新记录,在大多数情况下它运行良好,但从昨天开始它无法更新行。我目前正在开发基于Spring MVC的Web应用程序,在该应用程序中,我需要通过调用update()方法来执行DML操作 我使用的是JDBC模板,在我的更新方法中我编写了这个查询。 它获取了2018年1月的947条记录,我已经检查了所有记录是否唯一 我在这里被卡住了,我找不到重复的记录。我以为这个异常是因为多个记录而发生的,但我认为我错了,有些东西我无法识别 以下是查询: UPDATE SALARY_

我编写了一个SQL查询来更新记录,在大多数情况下它运行良好,但从昨天开始它无法更新行。我目前正在开发基于Spring MVC的Web应用程序,在该应用程序中,我需要通过调用update()方法来执行DML操作

我使用的是JDBC模板,在我的更新方法中我编写了这个查询。 它获取了2018年1月的947条记录,我已经检查了所有记录是否唯一

我在这里被卡住了,我找不到重复的记录。我以为这个异常是因为多个记录而发生的,但我认为我错了,有些东西我无法识别

以下是查询:

    UPDATE SALARY_DETAIL_REPORT_012018 sd         
SET sd.EMP_ID = 
(SELECT e.emp_id from EMPLOYEE e 
WHERE e.VERIFY_STATUS = 1 
AND e.RELIEF_TYPE IS NULL                                   
AND e.emp_code = to_char(sd.emp_code) 
AND e.EMP_TYPE_ID!=03)                                   
WHERE EXISTS 
(SELECT e.emp_id from EMPLOYEE e 
WHERE e.VERIFY_STATUS = 1                           
AND e.emp_code = to_char(sd.emp_code) 
AND e.EMP_TYPE_ID!=03 AND e.RELIEF_TYPE IS NULL)           
AND sd.EMP_ID IS NULL      
AND sd.REFERENCE_ID LIKE '203-%'
下面是我的DAOImpl类中的Java代码

 public void update(String tableSuffix, String regionId, String circleId) {
        String tabName = "SALARY_DETAIL_REPORT_" + tableSuffix;
            String q = "UPDATE " + tabName + " sd"
                    + "         SET sd.EMP_ID = (SELECT e.emp_id "
                    + "                                  from EMPLOYEE e WHERE e.VERIFY_STATUS = 1 AND e.RELIEF_TYPE IS NULL "
                    + "                                  AND e.emp_code = to_char(sd.emp_code) AND e.EMP_TYPE_ID!=03) "
                    + "                                  WHERE "
                    + "         EXISTS (SELECT e.emp_id from EMPLOYEE e WHERE e.VERIFY_STATUS = 1 "
                    + "                          AND e.emp_code = to_char(sd.emp_code) AND e.EMP_TYPE_ID!=03 AND e.RELIEF_TYPE IS NULL) "
                    + "          AND sd.EMP_ID IS NULL";
            if (circleId != null && !circleId.trim().equals("")) {
                q += "      AND sd.REFERENCE_ID LIKE '" + circleId + "-%' ";
            } else {
                q += "      AND sd.REFERENCE_ID LIKE '" + regionId + "-%' ";
            }

            //   System.out.println("q " + q);
            MapSqlParameterSource param = new MapSqlParameterSource();
            getNamedParameterJdbcTemplate().update(q, param);

    }

请向我推荐最佳解决方案

您需要查找阻止查询运行的行

运行此查询:

SELECT sd.emp_code, COUNT(*) as cnt 
FROM EMPLOYEE e 
WHERE e.VERIFY_STATUS = 1 AND
      e.RELIEF_TYPE IS NULL  AND                                 
      e.emp_code = to_char(sd.emp_code) AND
      e.EMP_TYPE_ID <> 03
GROUP BY sd.emp_code
HAVING COUNT(*) > 1;
选择sd.emp_代码,将(*)计数为cnt
来自雇员e
其中e.VERIFY_STATUS=1和
e、 释放类型为NULL,并且
e、 emp_代码=to_字符(sd.emp_代码)和
e、 EMP_类型_ID 03
按sd.emp_代码分组
计数(*)大于1;
这有候选人的问题。你能做什么?最简单的问题是:

  • SELECT
    更改为
    SELECT MAX(sd.emp\U代码)
  • 使用
    和rownum=1更改
    中的

您是否检查了问题是否存在于数据库中的无效数据?数据在表中有效以下查询返回什么:
从员工组中按计数(*)大于1的emp代码选择emp代码,计数(*)
?您选择的e.emp id返回多个值我在这里尝试的是,我只是将SALARY_DETAIL_表的EMP_代码与EMPLOYEE表匹配,如果匹配,则将映射的EMP_ID设置到record@user9634982 . . . 这将发现查询中的问题。这就是你的问题所在。要解决这个问题,请阅读完整的答案。