Oracle newbie eroare declarație de actualizare

voturi
9

interogare Oracle:

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

se întoarce următoarea eroare:

ORA-01427: un singur rând subinterogare returnează mai mult de un rând

O altă încercare de corecție:

 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;

returnează următoarea eroare:

ORA-30926: imposibilitatea de a obține un set stabil de rânduri în tabelele sursă

Sunt un noob și au nevoie de ajutor :(

mulțumesc.

Întrebat 02/10/2014 la 01:27
de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
2

Puteți atribui numai o singură valoare, scalar CASES_PRODUCED. Deci subinterogare tau are nevoie pentru a produce doar o singură valoare, scalară.

Ai nevoie pentru a găsi de ce subinterogare dvs. returnează mai mult de un rând.

SELECT DISTINCT ...va selecta rânduri unice, nu la fel ca ONE ROW.

Ai nevoie de suma totală a tuturor PRDCTN_RUN_ACTL_CASE_QTY în rândurile?

Sau media?

Sau numărul MAX?

Sau primul rând?

Utilizați o funcție agregată în cazul în care acest lucru:

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

In medie

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

Primul rand

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

Este critic, mai ales atunci când învață, și se luptă cu sintaxa, că ați înțeles în mod clar

  1. Ce ai nevoie de interogare
  2. Ce interogare se întoarce

Doar încearcă o grămadă de alternative până când veți obține succesul este un mod sigur de foc pentru a crea date eronate care pare să funcționeze.

Sugestia mea este de a copia mai întâi interogarea secundară SELECTîntr - o altă fereastră și rulați - l, vedere și să înțeleagă rezultatele. Ar trebui să fie clar că este un rezultat cu mai multe rânduri. Lucrul cu interogarea secundară până când returnează un rezultat corect, singur, apoi conectați - l înapoi în actualizarea mai mare.

Publicat 02/10/2014 la 01:35
sursa de către utilizator

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