2015-10-13 114 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。 。 。是的。 –