Oracle novato error instrucción de actualización

votos
9

oráculo de consulta:

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

está regresando el error siguiente:

ORA-01427: de una sola fila subconsulta devuelve más de una fila

Otro intento de corrección:

 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;

devuelve el siguiente error:

ORA-30926: no se puede obtener un conjunto estable de filas en las tablas de origen

Soy un novato y necesito ayuda :(

gracias.

Publicado el 02/10/2014 a las 01:27
por usuario
En otros idiomas...                            


1 respuestas

votos
2

Se puede asignar un único valor, escalar a CASES_PRODUCED. Por lo que su subconsulta necesita para producir un solo valor, escalar.

Es necesario encontrar qué su sentencia devuelve más de una fila.

SELECT DISTINCT ...seleccionará filas únicas, no es igual que ONE ROW.

¿Necesita la suma total de todos los PRDCTN_RUN_ACTL_CASE_QTY en las filas?

O el promedio?

O el número MAX?

O la primera fila?

Utilizar una función agregada de ser así:

Total

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

Max

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

Promedio

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

Primera fila

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

Es muy importante, sobre todo cuando se está aprendiendo, y luchando con la sintaxis, que entiende claramente

  1. Lo que necesita de la consulta
  2. Lo que su consulta está volviendo

Sólo tratando un montón de alternativas hasta que llegue el éxito es una forma segura de crear datos erróneos que parece funcionar.

Mi sugerencia es copiar primero la sub consulta SELECTa una ventana diferente y ejecutarlo, ver y entender los resultados. Debe quedar claro que es el resultado de varias filas. Trabajar con la sub consulta hasta que se vuelve un solo resultado correcto, a continuación, vuelva a conectarlo a la actualización más grande.

Respondida el 02/10/2014 a las 01:35
fuente por usuario

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