使用聚合函数和SELECT更新

时间:2013-11-25 22:01:58

标签: sql ms-access

我正在尝试编写一条SQL指令,用于更新与所有交付和订单总数相关的数据库存产品数量。

UPDATE tbl_Product 
SET tbl_Product.Quantity = Q.Quantity
FROM 
    tbl_Product 
    INNER JOIN 
    (
        SELECT tbl_Order.IdProduct, 
        SUM(tbl_Delivery.Quantity)-SUM(tbl_Order.Quantity) AS Quantity 
        FROM 
            tbl_Order
            INNER JOIN 
            tbl_Delivery 
                ON tbl_Order.IdProduct = tbl_Delivery.IdProduct 
        GROUP BY tbl_Order.IdProduct
    ) as Q 
        ON Q.IdProduct = tbl_Product.IdProduct;

语法错误。

4 个答案:

答案 0 :(得分:1)

UPDATE tbl_Product  
    INNER JOIN 
    (
        SELECT tbl_Order.IdProduct, 
        SUM(tbl_Delivery.Quantity)-SUM(tbl_Order.Quantity) AS Quantity 
        FROM 
            tbl_Order
            INNER JOIN 
            tbl_Delivery 
                ON tbl_Order.IdProduct = tbl_Delivery.IdProduct 
        GROUP BY tbl_Order.IdProduct
    ) as Q 
        ON Q.IdProduct = tbl_Product.IdProduct   
        SET tbl_Product.Quantity = Q.Quantity

删除FROM移动SET最后一次。

答案 1 :(得分:1)

Access SQL不支持您尝试使用的语法。查询

UPDATE foo
SET foo.thing = bar.thing
FROM
    foo
    INNER JOIN
    bar
        ON foo.ID = bar.ID

导致查询表达式中出现“语法错误(缺少运算符)。”

Access SQL中的相应查询将是

UPDATE 
    foo 
    INNER JOIN 
    bar 
        ON foo.ID = bar.ID 
SET foo.thing = bar.thing

答案 2 :(得分:1)

使用联接的UPDATE访问可能很挑剔。在某些情况下,它可能会抱怨查询是只读的。由于您的UPDATE使用了与GROUP BY的联接,因此可能会在此处发生。

如果有,您可以使用DSum,因此Access会将您的查询视为可编辑。如果 IdProduct 是数字数据类型,请使用此...

UPDATE tbl_Product AS p 
SET p.Quantity = 
    DSum("Quantity", "tbl_Delivery", "IdProduct=" & p.IdProduct)
    - DSum("Quantity", "tbl_Order", "IdProduct=" & p.IdProduct)

但如果是文本类型,请将第三个选项的引号中的值括在DSum

UPDATE tbl_Product AS p 
SET p.Quantity = 
    DSum("Quantity", "tbl_Delivery", "IdProduct='" & p.IdProduct & "'")
    - DSum("Quantity", "tbl_Order", "IdProduct='" & p.IdProduct & "'")

答案 3 :(得分:0)

尝试为要更新的表分配昵称。这是您抽象的子查询的代码。这有帮助吗?

UPDATE P
SET P.Quantity = Q.Quantity
FROM tbl_Product P
INNER JOIN (...) as Q 
ON Q.IdProduct = P.IdProduct;