Sub Row Sub request возвращает более одной строки - PullRequest
0 голосов
/ 14 сентября 2018

Я написал SQL-запрос, который обновляет запись, в большинстве случаев она работает нормально, но со вчерашнего дня не удается обновить строку. В настоящее время я работаю над веб-приложением на основе Spring MVC, в котором мне нужно выполнить операцию DML. вызывая метод update ().

Я использую шаблон JDBC и в своем методе обновления я написал этот запрос. Он получает 947 записей за январь месяц 2018 года, и я уже проверил, что все записи уникальны.

Я застрял здесь, я не могу найти дублирование записи. Я думал, что это исключение произошло из-за множественной записи, но я думаю, что я ошибаюсь, есть кое-что, что я не могу идентифицировать.

Вот запрос:

    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-%'

и ЗДЕСЬ - код Java в моем классе DAOImpl

 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);

    }

Пожалуйста, предложите мне лучшее решение

1 Ответ

0 голосов
/ 14 сентября 2018

Вам нужно найти строки, которые препятствуют выполнению вашего запроса.

Запустите этот запрос:

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;

У этого есть возможные проблемы.Что ты можешь сделать?Самое простое - это одна из проблем:

  • Измените SELECT на SELECT MAX(sd.emp_code)
  • Измените WHERE с помощью AND rownum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...