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