为什么我的更新(从何时选择)语句拒绝识别我的表别名?

时间:2012-05-11 15:14:41

标签: sql oracle subquery

我正在浏览AskTom网站,发现什么应该是一个非常强大的更新状态工具,但我的声明拒绝接受子查询后的别名。 有人可以帮我解释一下这可能会有解决方案吗?

Update (SELECT T.Date_,T.Name_ 
        FROM TableA T, TableB P
        WHERE P.Date_ = T.Date_
        AND   P.Name_ = T.Name_) SET P.ID = T.Name_

如何运行此类更新可能还有其他问题,这将是一个奖励。在尝试理解别名问题时,我对此更感兴趣。我已经尝试过了

TableB.ID = TableA.Name_ 

但没有运气

具体而言,错误是ORA-00904无效标识符。

一如既往地感谢。

我已经回答了上述问题,但在尝试理解时我还有其他一些问题。

我现在得到ORA-01779无法修改映射到非密钥保留表的列。 我认为这是指我正在尝试更新正确的表格?因为我可以从视图或任何其他可能没有pk或fk的适当来源更新。

这种类型的更新语句可以与Oracle临时表一起使用,还是可以预料到问题?

我可以将这种类型的语句与case语句一起使用来更新TableA中的多个列,还是会出现问题?

再次感谢。

1 个答案:

答案 0 :(得分:5)

执行UPDATE (query)操作时,可以在括号外使用的唯一列是查询返回的列的名称 - 在本例中为Date_和Name_。您在查询中使用的表别名在括号外也无效。

您需要的是:

Update (SELECT P.ID ,T.Name_ 
        FROM TableA T, TableB P
        WHERE P.Date_ = T.Date_
        AND   P.Name_ = T.Name_) SET ID = Name_