новичку оракул ошибка оператор обновления

голоса
9

оракул запрос:

UPDATE AIRMODEL_NETWORK_SUMMARY 
SET CASES_PRODUCED = (SELECT DISTINCT PRDCTN_RUN_ACTL_CASE_QTY
                       FROM AIRMODEL_NETWORK_SUMMARY, HISTORY_PRODUCTION, PERIOD_TO_PROCESS
                      WHERE AIRMODEL_NETWORK_SUMMARY.FSCL_WK_IN_YR_NUM = HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM 
                        AND AIRMODEL_NETWORK_SUMMARY.FSCL_YR_NUM = HISTORY_PRODUCTION.FSCL_YR_NUM 
                        AND AIRMODEL_NETWORK_SUMMARY.LOC_ID = HISTORY_PRODUCTION.LOC_ID 
                        AND HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM = PERIOD_TO_PROCESS.FSCL_WK_IN_YR_NUM 
                        AND HISTORY_PRODUCTION.FSCL_YR_NUM = PERIOD_TO_PROCESS.FSCL_YR_NUM);

возвращается следующее сообщение об ошибке:

ОР-01427: однорядный подзапрос возвращает более одной строки

Еще одна попытка коррекции:

 MERGE INTO AIRMODEL_NETWORK_SUMMARY AIRMODEL_NETWORK_SUMMARY1 
  USING (SELECT DISTINCT PRDCTN_RUN_ACTL_CASE_QTY, 
           AIRMODEL_NETWORK_SUMMARY2.rowid AS r 
      FROM AIRMODEL_NETWORK_SUMMARY AIRMODEL_NETWORK_SUMMARY2 
           INNER JOIN HISTORY_PRODUCTION 
              ON AIRMODEL_NETWORK_SUMMARY2.FSCL_WK_IN_YR_NUM = HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM 
                 AND AIRMODEL_NETWORK_SUMMARY2.FSCL_YR_NUM = HISTORY_PRODUCTION.FSCL_YR_NUM 
                 AND AIRMODEL_NETWORK_SUMMARY2.LOC_ID = HISTORY_PRODUCTION.LOC_ID 
           INNER JOIN PERIOD_TO_PROCESS 
              ON HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM = PERIOD_TO_PROCESS.FSCL_WK_IN_YR_NUM 
                 AND HISTORY_PRODUCTION.FSCL_YR_NUM = PERIOD_TO_PROCESS.FSCL_YR_NUM) 
   ON (AIRMODEL_NETWORK_SUMMARY1.rowid = r) 
 WHEN MATCHED THEN UPDATE 
  SET CASES_PRODUCED = PRDCTN_RUN_ACTL_CASE_QTY;

возвращает следующее сообщение об ошибке:

ORA-30926: не удалось получить стабильный набор строк в исходных таблицах

Я нуб и нужна помощь :(

Спасибо.

Задан 02/10/2014 в 01:27
пользователем
На других языках...                            


1 ответов

голоса
2

Вы можете назначить только один, скалярное значение CASES_PRODUCED. Таким образом, ваш подзапрос должен производить только одно, скалярное значение.

Вы должны найти, почему ваш подзапрос возвращает более одной строки.

SELECT DISTINCT ...подберет уникальные строки, не такие же , как ONE ROW.

Нужна ли вам полную сумму всех PRDCTN_RUN_ACTL_CASE_QTY в строках?

Или среднее?

Или число MAX?

Или первый ряд?

Используйте агрегатную функцию, если так:

Всего

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT SUM(PRDCTN_RUN_ACTL_CASE_QTY) ...

Максимум

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT MAX(PRDCTN_RUN_ACTL_CASE_QTY) ...

В среднем

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT AVG(PRDCTN_RUN_ACTL_CASE_QTY) ...

Первая строка

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT PRDCTN_RUN_ACTL_CASE_QTY ... 
                          FROM ... 
                          WHERE ROWNUM = 1)

Это очень важно, особенно при обучении, и борется с синтаксисом, что вы четко понимать

  1. Что вам нужно от запроса
  2. Что ваш запрос возвращается

Просто пытаюсь кучу вариантов, пока вы не получите успех верный способ создать ошибочные данные, которые, кажется, работает.

Мое предложение заключается в первую скопировать подзапрос SELECTв другое окно и запустить его, просмотреть и понять результаты. Должно быть ясно , что это результат мульти-строки. Работа с подзапроса , пока он не возвращается правильный, один результат, а затем вставьте его обратно в больших обновлений.

Ответил 02/10/2014 в 01:35
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more