使用子查询更新语句

时间:2013-10-08 03:55:40

标签: sql ms-access sql-update subquery

带子查询的MS Access更新语句

我有Order表和OrderDetails表。 OrderDetails表包含数量和小计的订单项。我想运行一个查询来更新Order表中的“Total Amount Before Discount”,其中包含对应的订单行小计的总和值。

我现在的查询如下。我无法在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]));

3 个答案:

答案 0 :(得分:2)

我认为你不需要加入。如下:

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

上述查询将为订单表格中的每条记录更新折扣前总金额。如果您只想更新某个订单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

答案 1 :(得分:2)

您可以在UPDATE查询中使用DSum Function

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 & "'"

答案 2 :(得分: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]);  

希望这是有道理的。