SQL Обновление с COUNT (*) менее 2 - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть две таблицы для запроса. Таблица "Order_Details" и таблица "Product". Мне нужно СЧИТАТЬ (*) количество раз, когда каждый продукт был заказан (идентифицируется уникальным «ORDER_ID») из таблицы «Order_Details». Если количество заказов на товар меньше 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;

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Моя первая мысль - это коррелированный подзапрос:

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

Это почти прямой перевод вашего вопроса и обобщает лучше, чем запрос Тима. Тем не менее, у Тима должна быть лучшая производительность с разумными показателями.

2 голосов
/ 21 февраля 2020

Вот один из способов, используя коррелированные подзапросы, чтобы проверить, есть ли у данного товара только один или ноль заказов. Если так, то мы уменьшаем цену на единицу.

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);
0 голосов
/ 21 февраля 2020

Я бы просто использовал условие 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);

Примечание. Не зная вашей схемы правильно, я сделал предположения об именах столбцов, чтобы проиллюстрировать, как мне к этому подойти.

...