newbie Oracle errore di istruzione di aggiornamento

voti
9

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

sta tornando il seguente errore:

ORA-01427: sola riga sottoquery restituisce più di una riga

Un altro tentativo di correzione:

 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;

restituisce il seguente errore:

ORA-30926: impossibile ottenere un insieme stabile di righe nelle tabelle di origine

Io sono un noob e bisogno di aiuto :(

grazie.

È pubblicato 02/10/2014 alle 01:27
dall'utente
In altre lingue...                            


1 risposte

voti
2

È possibile assegnare un solo, valore scalare a CASES_PRODUCED. Così il vostro subquery ha bisogno per produrre un solo, valore scalare.

Hai bisogno di trovare il motivo per cui il vostro sottoquery restituisce più di una riga.

SELECT DISTINCT ...selezionerà righe univoche, non lo stesso come ONE ROW.

Avete bisogno la somma totale di tutte le PRDCTN_RUN_ACTL_CASE_QTY nelle righe?

O la media?

O il numero di MAX?

O la prima fila?

Utilizzare una funzione di aggregazione in caso affermativo:

Totale

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

Media

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

Prima riga

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

E 'fondamentale, soprattutto quando si impara, e lottando con la sintassi, che si capisce chiaramente

  1. Quello che vi serve dalla query
  2. Che la query sta tornando

Sto solo cercando un po 'di alternative fino ad ottenere il successo è un modo sicuro per creare i dati errati che sembra funzionare.

Il mio suggerimento è quello di copiare prima la sottoquery SELECTa una finestra diversa ed eseguirlo, visualizzare e comprendere i risultati. Dovrebbe essere chiaro che è un risultato multi-riga. Lavorare con il subquery fino a quando non sta tornando una corretta, singolo risultato, quindi collegarlo nuovamente dentro l'aggiornamento più grande.

Risposto il 02/10/2014 a 01:35
fonte dall'utente

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