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 更新的主要内容,如果未能解决你的问题,请参考以下文章