2014-10-02 21 views
0

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

還是返回了以下錯誤:

ORA-01427: single-row subquery returns more than one row

在校的另一種嘗試:

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; 

返回以下錯誤:

ORA-30926: unable to get a stable set of rows in the source tables

我是一個noob,需要幫助:(

謝謝。

回答

2

您只能將一個標量值分配給CASES_PRODUCED。所以你的子查詢只需要產生一個單一的標量值。

您需要找出爲什麼您的子查詢返回多行。

SELECT DISTINCT ...將選擇唯一行,與ONE ROW不一樣。

您是否需要行中所有PRDCTN_RUN_ACTL_CASE_QTY的總和?

還是平均?

或MAX數字?

還是第一行?

使用聚合函數,如果這樣:

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

最大

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

平均

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

第一行

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

它學習時,和語法努力是至關重要的,尤其是,你清楚地瞭解

  1. 你的查詢返回

只要你從查詢需要什麼嘗試一堆替代品直到你獲得成功是一種確定的方式來創建似乎工作的錯誤數據。

我的建議是首先將子查詢SELECT複製到不同的窗口並運行它,查看和理解結果。應該清楚這是一個多行結果。使用子查詢直到它返回正確的單個結果,然後將其重新插入到更大的更新中。

+0

我正在嘗試更新airmodel_network_summary中select列中的值時滿足條件的列。 – 2014-10-02 03:32:22