newbie oracle błąd oświadczenie aktualizacja

głosy
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);

zwraca następujący błąd:

ORA-01427: jednorzędowy Podzapytanie zwraca więcej niż jeden wiersz

Kolejna próba korekty:

 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;

zwraca następujący błąd:

ORA-30926: nie można uzyskać stabilnego zestawu wierszy w tabelach źródłowych

Jestem noobem i potrzebują pomocy :(

Dziękuję Ci.

Utwórz 02/10/2014 o 01:27
użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

można przypisać tylko jeden, wartość skalarną do CASES_PRODUCED. Więc podzapytanie musi produkować tylko jeden, wartość skalarna.

Musisz dowiedzieć dlaczego podzapytanie zwraca więcej niż jeden wiersz.

SELECT DISTINCT ...wybiorą unikatowe wiersze, to nie to samo ONE ROW.

Czy trzeba sumę wszystkich PRDCTN_RUN_ACTL_CASE_QTY w rzędach?

Lub średnia?

Lub numer MAX?

Lub pierwszy wiersz?

Użyj funkcji zagregowanego jeśli tak, to:

Całkowity

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

Średni

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

Pierwszy rząd

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

Bardzo ważne jest, zwłaszcza podczas nauki i walczą ze składnią, które jasno zrozumieć

  1. Co trzeba z kwerendy
  2. Co zapytanie wraca

Tylko próbuje kilka alternatyw, aż pojawi się sukces jest pewny sposób ogień do tworzenia błędnych danych, który wydaje się działać.

Moja propozycja jest najpierw skopiować podzapytanie SELECTdo innego okna i uruchom go zobaczyć i zrozumieć, wyniki. Powinno być jasne, że jest to wynik multi-row. Praca z podzapytania do momentu powrotu prawidłowej, pojedynczy wynik, a następnie podłącz go z powrotem do większej aktualizacji.

Odpowiedział 02/10/2014 o 01:35
źródło użytkownik

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