Chyba výkaz aktualizace nováček oracle

hlasů
9

oracle dotaz:

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 vrací následující chybu:

ORA-01427: jednořadá poddotaz vrátí více než jeden řádek

Další pokus o nápravu:

 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;

vrátí následující chybě:

ORA-30926: nelze získat stabilní sadu řádků v zdrojových tabulek

Jsem noob a potřebují pomoc :(

Děkuji.

Položena 02/10/2014 v 01:27
uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Můžete přiřadit pouze jedinou, skalární hodnoty CASES_PRODUCED. Takže vaše Poddotaz potřebuje vyrábět pouze jediný skalární hodnoty.

Budete muset najít důvod, proč váš poddotaz vrátí více než jeden řádek.

SELECT DISTINCT ...vybere jedinečné řádky, není totéž co ONE ROW.

Potřebujete celkový součet veškerého PRDCTN_RUN_ACTL_CASE_QTY v řadách?

Nebo průměr?

Nebo číslo MAX?

Nebo první řadě?

Použít agregační funkci v takovém případě:

Celkový

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

Průměrný

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

První řada

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

Je velmi důležité, zvláště když se učí, a snaží se syntaxí, že jste jasně pochopit

  1. Co budete potřebovat z dotazu
  2. Jaký je váš dotaz vrací

Jen se snaží spoustu alternativ, až se dostanete úspěch je jistý oheň způsob, jak vytvořit chybné údaje, které se zdá fungovat.

Můj návrh je nejprve zkopírovat poddotaz SELECTdo jiného okna a spusťte jej, názor a pochopit výsledky. Mělo by být jasné, že se jedná o důsledek multi-row. Práce s poddotazu, dokud se vrací správný, jediný výsledek, pak ji znovu zapojte do větší aktualizace.

Odpovězeno 02/10/2014 v 01:35
zdroj uživatelem

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