这个MS-Access的UPDATE语句出了什么问题?

时间:2011-02-10 02:27:13

标签: sql database visual-studio-2008 ms-access

我正在尝试根据另一个表(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'
             );

3 个答案:

答案 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'