我有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]));
答案 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]);
希望这是有道理的。