COUNT(*) 小于 2 的 SQL 更新

Posted

技术标签:

【中文标题】COUNT(*) 小于 2 的 SQL 更新【英文标题】:SQL Update with COUNT(*) less than 2 【发布时间】:2020-02-21 14:34:41 【问题描述】:

我有两个要查询的表。一个“Order_Details”表和一个“Product”表。我需要从“Order_Details”表中计算(*)每种产品的订购次数(由唯一的“ORDER_ID”标识)。如果一个产品的订购次数少于 2 次,我需要将价格降低 1 美元。这也是从两个表中完成的,因为尚未订购的商品也需要降低价格。但是,这些 Product_ID 不会显示在“Order_Details”表中。我能够弄清楚如何选择订购少于 2 次的所有产品。但是,我不知道如何做同样的事情,而是更新价格。这是我想出的 SELECT 语句。

SELECT PRODUCT_NAME, COUNT(*)
FROM PRODUCT FULL JOIN ORDER_DETAILS
ON PRODUCT.PRODUCT_ID = ORDER_DETAILS.PRODUCT_ID
HAVING COUNT(*) < 2
GROUP BY PRODUCT_NAME;

【问题讨论】:

【参考方案1】:

这是一种方法,使用相关子查询来检查给定产品是否只有一个或零个订单。如果是这样,那么我们将价格减一。

UPDATE PRODUCT p
SET PRICE = PRICE - 1
WHERE
    (SELECT COALESCE(MIN(ORDER_ID), 0) FROM ORDER_DETAILS od
     WHERE od.PRODUCT_ID = p.PRODUCT_ID) =
    (SELECT COALESCE(MAX(ORDER_ID), 0) FROM ORDER_DETAILS od
     WHERE od.PRODUCT_ID = p.PRODUCT_ID);

【讨论】:

这应该比我建议的版本有更好的性能,但它并没有那么容易推广到“2”之外。【参考方案2】:

我的第一个想法是关联子查询:

UPDATE PRODUCT p
SET PRICE = PRICE - 1
WHERE (SELECT COUNT(*)
       FROM ORDER_DETAILS
       WHERE od.PRODUCT_ID = p.PRODUCT_ID
      ) < 2;

这几乎是您问题的直接翻译,并且比 Tim 的查询更概括。也就是说,Tim's 应该有更好的性能和合理的索引。

【讨论】:

【参考方案3】:

我只需使用IN 子句通过选择我想降低价格的每种产品的PRODUCT_ID 来实现此目的。

SQL 将是这样的(请参阅下面的注释):

UPDATE  PRODUCT
  SET   PRODUCT_PRICE = PRODUCT_PRICE - 1
  WHERE PRODUCT_ID IN (
                      SELECT  PRODUCT_ID
                        FROM  PRODUCT 
                          FULL JOIN ORDER_DETAILS ON PRODUCT.PRODUCT_ID = ORDER_DETAILS.PRODUCT_ID
                        HAVING COUNT(*) < 2
                        GROUP BY PRODUCT_NAME);

注意:在不正确了解您的架构的情况下,我对列名做出了假设,以说明我将如何处理这个问题。

【讨论】:

以上是关于COUNT(*) 小于 2 的 SQL 更新的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 更新集

请教数据库高手,在access2003里,用sql语句查询实现两表关联查询用count更新其中一表?

sql update操作结果

用sql语句更新一条记录,如果不存在就插入,怎么写?

SQL 子查询大于/小于运算符

mysql数据库,sql语句,把一个表中的统计数量,更新到两一个表中