计数(*)小于2的SQL更新

计数(*)小于2的SQL更新,sql,oracle,sql-update,Sql,Oracle,Sql Update,我有两个表要查询。订单详情表和产品表。我需要从ORDER_Details(订单详细信息)表中计算*每个产品被唯一订单ID标识的次数。如果产品订购次数少于2次,我需要降价1美元。这也是从两个表中完成的,因为尚未订购的项目也需要降价。但是,这些产品标识不会显示在订单详细信息表中。我能够想出如何选择所有订购不到2次的产品。然而,我不知道如何做同样的事情,但与更新的价格。这是我想出的SELECT语句 SELECT PRODUCT_NAME, COUNT(*) FROM PRODUCT FULL JOIN

我有两个表要查询。订单详情表和产品表。我需要从ORDER_Details(订单详细信息)表中计算*每个产品被唯一订单ID标识的次数。如果产品订购次数少于2次,我需要降价1美元。这也是从两个表中完成的,因为尚未订购的项目也需要降价。但是,这些产品标识不会显示在订单详细信息表中。我能够想出如何选择所有订购不到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;

这里有一种方法,使用相关子查询检查给定产品是否只有一个订单或零个订单。如果是这样的话,我们就把价格降低一倍

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);
我只需要使用IN子句来实现这一点,方法是选择我想要降低价格的每个产品的产品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);

注意:在不正确了解您的模式的情况下,我对列名进行了假设,以说明如何处理此问题。

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

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

这几乎是你问题的直接翻译,比蒂姆的问题概括得更好。也就是说,Tim的版本应该有更好的性能和合理的索引。

这应该比我建议的版本有更好的性能,但它不容易推广到2之外。