【问题标题】:SQL Update with COUNT(*) less than 2COUNT(*) 小于 2 的 SQL 更新
【发布时间】: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;

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案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);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 2016-10-26
        相关资源
        最近更新 更多