newbie orakel updateverklaring fout

stemmen
9

oracle query:

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

is terug te keren de volgende foutmelding:

ORA-01427: een rij subquery keert meer dan een rij

Een andere poging tot correctie:

 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;

geeft de volgende foutmelding:

ORA-30926: niet in staat om een ​​stabiele set rijen in de bron tafels

Ik ben noob en hulp nodig hebben :(

dank je.

De vraag is gesteld op 02/10/2014 om 01:27
user
In andere talen...                            


1 antwoorden

stemmen
2

U kunt slechts één scalaire waarde aan CASES_PRODUCED. Dus je subquery hoeft slechts een enkele scalaire waarde te produceren.

Je moet om uit te vinden waarom uw subquery meer dan een rij terug.

SELECT DISTINCT ...zal uniek rijen, niet hetzelfde als te selecteren ONE ROW.

Heeft u de totale som van alle PRDCTN_RUN_ACTL_CASE_QTY in de rijen nodig?

Of het gemiddelde?

Of het MAX-nummer?

Of de eerste rij?

Gebruik een statistische functie zo ja:

Totaal

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

Gemiddelde

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

Eerste rij

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

Het is van cruciaal belang, met name bij het leren, en worstelen met syntax, dat je goed begrijpen

  1. Wat je nodig hebt van de query
  2. Wat Uw verzoek terug te keren

Ik probeer een heleboel alternatieven totdat je succes is een manier om zeker vuur foutieve gegevens die lijkt te werken te creëren.

Mijn suggestie is om eerst de subquery te kopiëren SELECTnaar een ander venster en voer het uit, bekijken en begrijpen van de resultaten. Het moge duidelijk zijn dat het een multi-rij resultaat. Werken met de subquery totdat het een juiste, enkel resultaat keert terug, steek de stekker weer in de grotere-update.

antwoordde op 02/10/2014 om 01:35
bron van user

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