我正在尝试根据另一个表(PricePlan)中的字段更新字段。在PricePlan中,我有2个字段,“访客”和“会员”以及“价格”列,但在这种情况下,我希望我的另一个表中的“价格”根据“访客的价值”进行更新。当我调试时,我在VS2008中收到以下错误'System.Data.dll中发生了'System.Data.OleDb.OleDbException'类型的未处理异常附加信息:操作必须使用可更新的查询。
我的UPDATE
声明出了什么问题?
UPDATE Bill
SET Price = ( SELECT PricePlan.Price
FROM PricePlan
WHERE PricePlan.PricePlanName = 'Guest'
)
WHERE EXISTS (Select PricePlan.Price
FROM PricePlan
WHERE PricePlan.PricePlanName ='Guest'
);
答案 0 :(得分:2)
我记得,这些更新声明更像是:
UPDATE Bill
SET Price = PricePlan.Price
FROM (SELECT Price FROM PricePlan
WHERE PricePlanName = 'Guest')
但我并不完全清楚你要完成什么。您能否在前后场景中提供表格所包含内容的示例?
修改强>
基于http://dbaspot.com/forums/ms-access/138825-select-inside-update.html,我猜这样的事情可能有用:
UPDATE Bill,PricePlan
SET Bill.Price = PricePlan.Price
WHERE PricePlan.PricePlanName = 'Guest'
AND ... (put something here to limit which bills you want to update)
答案 1 :(得分:1)
您的代码本身没有任何“错误”:它是中级标准SQL-92代码,格式也很好:)
可悲的是,Access(ACE,Jet,等等)不符合SQL-92,甚至不是入门级别。 UPDATE
语法是最糟糕的失败,IMO。 Circa Access 2000 SQL Server团队获得了引擎的所有权,并试图使其符合标准,但被Windows团队阻止,他们的代码依赖于Access's proprietary UPDATE syntax。它现在永远不会实现SQL-92,没有希望。
Access是“错误的”。我恳请您转向功能更强大的SQL产品。 SQL Server 2008 Express将是我个人的选择。
如果您不能/不会移动,那么您将被迫学习Access的专有语法(不只是UPDATE
!),同时还会遇到其他许多怪癖和限制。
答案 2 :(得分:0)
最明显的错误是更新后的表Bill
和子查询之间存在无关联!你想做什么?
也许是下面的内容?
UPDATE Bill inner join PricePlan on PricePlan.Id = Bill.Id
SET Bill.Price = PricePlan.Price
WHERE PricePlan.PricePlanName = 'Guest'