【问题标题】:Update Table From Select Statement Sql Query从 Select 语句 Sql 查询更新表
【发布时间】:2014-05-15 23:02:30
【问题描述】:

我有三个表,一个包含可用产品的列表,其中包含产品价格等相关详细信息,另一个包含订单,最后一个包含特定订单详细信息,包括订单中购买的商品。

我正在尝试创建一个查询来计算订单的总价格,方法是使用内部连接链接两个表,然后使用该值更新订单表。我编写的代码包含语法错误,作为一个新手,我可能犯了一个明显的错误,但我们将不胜感激。

 "SELECT Sum(ProductTable.prodPrice) AS Total, OrderDetailTable.orderID " +
             "FROM ProductTable INNER JOIN OrderDetailTable " +
             "ON ProductTable.prodID = OrderDetailTable.prodID " +
             "GROUP BY OrderDetailTable.orderID " +
             "HAVING OrderDetailTable.orderID = ? " +
             "UPDATE OrderTable " +
             "SET " +
             "totalPrice = Total "  +
             "WHERE OrderTable.orderID = ? ";

我正在使用 Access。 我也忘了提那个?使用 Dataview 参数表示

        pc.Add(new Parameter("?", TypeCode.Int32, basketId.ToString()));

编辑:使用 PaqoGomez 的建议将 Total 声明为一个值,我现在得到错误:查询表达式 '0WHERE OrderTable.orderID = ?' 中的语法错误(缺少运算符)。

【问题讨论】:

  • 来自查询的更新往往是特定于供应商的。您使用的是什么 DBMS?
  • 我正在使用 Microsoft Access
  • 对不起,但几乎任何尝试都会导致“操作必须使用可更新查询”您可以尝试使用查询并加入到该查询中。
  • 你能让这个工作吗?从这里看起来像是一个简单的字符串连接间距问题。请考虑投票、标记答案或评论对您有帮助的答案。

标签: c# sql ms-access select sum


【解决方案1】:

在 OP 将其描述为 MS Access 之前发表的评论: 没有尝试过,但您选择并更新错误的方式。这应该非常接近。对我来说已经有一段时间了,但您可能需要更改 FROM 子句以引用您正在更新的表并 INNER JOIN 子选择而不是 WHERE 子句。

"UPDATE OrderTable " +
"SET totalPrice = Sum(ProductTable.prodPrice)" +
"FROM (" +
    "SELECT OrderDetailTable.orderID, Sum(ProductTable.prodPrice)" +
    "FROM ProductTable INNER JOIN OrderDetailTable " +
    "ON ProductTable.prodID = OrderDetailTable.prodID " +
    "GROUP BY OrderDetailTable.orderID " +
    ") x" +
"WHERE x.orderID = OrderTable.OrderId" 

更新:

根据有关 MS Access 的 OP 更新,您可以使用子查询进行更新,但我认为这取决于您使用的 MS Access 版本以及您的操作方式。下面的帖子似乎表明它很成问题:

SQL Subqueries (Microsoft Access SQL)

How do I perform update query with subquery in Access?

Can It Be Done - Access 2007 SQL Update Query Using a Subquery?

【讨论】:

  • 这种语法对于 Access 来说一点也不接近。它的作用类似于UPDATE T1 JOIN t2 SET t1.field = t2.field
  • @ConradFrix 同意。 OP 在我发布后更新了帖子说它来自 MS Access。我已经更新了帖子以尝试添加一些帮助。
  • 看起来 OP 消失了。很好的答案,我会给你一个 +1
【解决方案2】:

通过声明一个变量,您可以保存总值,以便在以后的更新中使用它。

declare @Total int;
SELECT @Total = Sum(ProductTable.prodPrice)
//...
"SET " +
"totalPrice = @Total " 

你没有提到你使用的是哪个数据库平台,我假设是 MSSQL,其他平台需要稍微不同的语法。

您可能还想知道,如果您使用@ 符号,您可以有一个多行字符串。这将允许你避免你正在做的连接。例如。

var sql = @"some
              sql
            string"

【讨论】:

  • 抱歉,它是 Access。
  • @user3495336,该语法也适用于 Access。当帖子有帮助时,请务必点赞并标记为答案!谢谢
  • @user3495336,你找到答案了吗?
  • 再次抱歉,回复晚了,您提供的确切语法与我的项目不兼容,但我对其进行了调整,以便将 Total 声明为整数,然后使用它将 totalPrice 设置为等于它。尝试更新数据库时仍然出现语法错误(缺少运算符)。
  • @user3495336,缺少操作员?我不关注,你能用错误更新问题吗?或者您应该在这里接受一个答案并创建一个新问题?