débutant erreur de traitement de mise à jour oracle

voix
9

requête 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);

est de retour l'erreur suivante:

ORA-01427: sous-requête une seule rangée retourne plus d'une rangée

Une autre tentative de correction:

 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;

renvoie l'erreur suivante:

ORA-30926: incapable d'obtenir un ensemble stable de lignes dans les tables source

Je suis un noob et besoin d'aide :(

Je vous remercie.

Créé 02/10/2014 à 01:27
utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Vous pouvez attribuer une seule valeur scalaire à CASES_PRODUCED. Ainsi, votre sous-requête doit produire une seule valeur scalaire.

Vous devez trouver pourquoi votre sous-requête renvoie plus d'une ligne.

SELECT DISTINCT ...sélectionnera les lignes uniques, pas les mêmes que ONE ROW.

Avez-vous besoin de la somme totale de tous les PRDCTN_RUN_ACTL_CASE_QTY dans les rangs?

Ou la moyenne?

Ou le nombre MAX?

Ou la première ligne?

Utiliser une fonction d'agrégation dans ce cas:

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

Moyenne

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

Première rangée

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

Il est essentiel, en particulier lors de l'apprentissage, et aux prises avec la syntaxe, que vous comprenez clairement

  1. Ce que vous avez besoin de la requête
  2. Qu'est-ce que votre demande de retour

Juste essayer un tas d'alternatives jusqu'à ce que vous obtenez le succès est un moyen sûr de créer des données erronées qui semble fonctionner.

Ma suggestion est d'abord copier la sous - requête SELECTà une autre fenêtre et l' exécuter, visualiser et comprendre les résultats. Il doit être clair qu'il est le résultat de plusieurs rangs. Travailler avec la sous - requête jusqu'à ce qu'il soit un retour correct, seul résultat, puis rebranchez dans la mise à jour plus grande.

Créé 02/10/2014 à 01:35
source utilisateur

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