1

带有子查询的 MS Access 更新语句

我有 Order 表和 OrderDetails 表。OrderDetails 表具有带有数量和小计的订单行项目。我想运行一个查询以使用对应订单行小计的总和值更新订单表中的“折扣前总金额”。

我现在的查询如下。我无法在 Access 中运行它。它告诉我“您编写的子查询可以返回多个字段,而无需在主查询 FROM 子句中使用 EXISTS 保留字。修改子查询的 SELECT 语句以仅请求一个字段。”

UPDATE [Order] INNER JOIN OrderDetails ON Order.ID = OrderDetails.[Order ID]
SET [Order].[Total Amount Before Discount] = 
    (SELECT Order.ID, Sum(OrderDetails.[Subtotal After Discount]) AS [SumOfSubtotal After Discount]
     FROM [Order] INNER JOIN OrderDetails ON Order.ID = OrderDetails.[Order ID]
     GROUP BY Order.ID)
     WHERE (((Order.ID)=[OrderDetails].[Order ID]));
4

3 回答 3

2

我认为你不需要加入。以下情况如何:

UPDATE [Order] 
SET [Order].[Total Amount Before Discount] = 
    (
      SELECT Sum(OrderDetails.[Subtotal After Discount])
      FROM OrderDetails 
      WHERE [Order].ID = OrderDetails.[Order ID]
    )

上面的查询将为Order表中的每条记录更新Total Amount Before Discount 。如果您只想更新某个订单 ID,请使用以下命令:

UPDATE [Order] 
SET [Order].[Total Amount Before Discount] = 
    (
      SELECT Sum(OrderDetails.[Subtotal After Discount])
      FROM OrderDetails 
      WHERE [Order].ID = OrderDetails.[Order ID]
    )
WHERE [Order].ID = 786
于 2013-10-08T04:05:15.020 回答
2

您可以在查询中使用DSum 函数。UPDATE

UPDATE [Order] AS o
SET o.[Total Amount Before Discount] = 
    DSum
        (
            "[Subtotal After Discount]",
            "OrderDetails",
            "[Order ID]=" & o.ID
        );

请注意,如果数据类型[Order ID]是文本而不是数字,请在您在表达式中提供的值周围添加引号DSum...

            "[Order ID]='" & o.ID & "'"
于 2013-10-08T04:10:50.393 回答
1

几个观察,UPDATE 必须重写:重写你的查询,我们得到 - 如果你只更新一条记录,你不关心 GROUP BY:

UPDATE [Order]
SET [Order].[Total Amount Before Discount] = 
(Sum(OrderDetails.[Subtotal After Discount])
FROM [Order] INNER JOIN OrderDetails ON Order.ID = OrderDetails.[Order ID]
WHERE (([Order].ID)=[OrderDetails].[Order ID]);

首先,您不能更新 JOIN/INNER JOIN..

其次,您不能按照编写语句的方式更新多于一列,它必须类似于:

UPDATE [order]
SET    col1 = somevalue,
       col2 = anothervalue
WHERE  (([order].id) = [orderdetails].[Order ID]);  

希望这是有道理的。

于 2013-10-08T04:15:04.543 回答