2015-10-13 113 views
0

我嘗試執行以下命令:無效的ID上更新(甲骨文)

UPDATE DB_TEST.STOCK_ITEMS 
    SET STATUS = (SELECT * 
        FROM (SELECT STOCK_ITEM_STATUS 
          FROM DB_TEST.STOCK_ITEMS_HISTORY 
          WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID 
          ORDER BY CHANGED_ON DESC, ID DESC) 
        WHERE ROWNUM <= 1) 
WHERE EXISTS (SELECT * 
       FROM DB_TEST.STOCK_ITEMS_HISTORY 
       WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID); 

但我得到的錯誤:

SQL-Error: ORA-00904: "DB_TEST"."STOCK_ITEMS"."ID": invalid identifier 

我擡頭Oracle錯誤,但我得到的是,我應該使用錯誤或缺少列名稱,但DB_TEST.STOCK_ITEMS.ID字段肯定存在。

還有什麼其他原因會導致此錯誤?

+0

你不能用數據集更新一列'將狀態設置=(SELECT * ...)'無數據庫會知道該怎麼把數據上那個領域。您可能正在尋找:http://dba.stackexchange.com/a/3034/42478 –

+3

@JorgeCampos。 。 。閱讀查詢。子查詢只返回一個值。 –

回答

2

Oracle將表的範圍限制爲一個子查詢級別。這是解決使用問題的方法keep

UPDATE DB_TEST.STOCK_ITEMS 
    SET STATUS = (SELECT MAX(STOCK_ITEM_STATUS) KEEP (DENSE_RANK FIRST ORDER BY CHANGED_ON DESC, ID DESC) 
       FROM DB_TEST.STOCK_ITEMS_HISTORY 
       WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID 
       ) 
    WHERE EXISTS (SELECT 1 
       FROM DB_TEST.STOCK_ITEMS_HISTORY 
       WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID 
       ); 
+0

「OVER」是「FIRST」和「ORDER」之間的拼寫錯誤嗎?它會引發錯誤。 – Palmi

+0

@Palmi。 。 。是的。 –