SP не применяется к первому ряду таблицы - PullRequest
0 голосов
/ 01 апреля 2020

Я попытался обновить столбец в таблице, используя хранимые процедуры под названием customer_Type (). вот код, который я написал:

BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE n INT DEFAULT 0;
  DECLARE orderCount INT;
  DECLARE customerID INT;

SELECT COUNT(*) FROM customer INTO n;
SET i=0;
WHILE i<n DO 
SELECT customer_id into customerID from customer LIMIT i,1;
SELECT COUNT(ord_no) into orderCount
    FROM orders
    where orders.customer_id= customerID;

    CASE orderCount
        WHEN 1 THEN
        update customer SET customer_Type= 'One-time Customer' where customer_id = customerID;
        WHEN 2 THEN update customer SET customer_Type='Repeated Customer' where customer_id = customerID;
        WHEN 3 THEN update customer SET customer_Type='Frequent Customer'  where customer_id = customerID;
        ELSE  update customer SET customer_Type= 'Loyal Customer' where customer_id = customerID;

    END CASE;

  SET i = i + 1;
END WHILE;

END

вывод верен для всех клиентов, но SP не работал с первым клиентом, он не обновлял его тип.

Результат

1 Ответ

0 голосов
/ 02 апреля 2020

Первое, что приходит на ум:

A LIMIT без ORDER BY совершенно бессмысленно. В реляционной базе данных нет порядка. Он может вернуть любую нужную ему строку.

Второе:

Вместо WHILE l oop обычно используют CURSOR в такие случаи.

Третье:

Вам вообще не нужна процедура для этого. Одного утверждения достаточно, чтобы решить вашу проблему:

UPDATE customer c
JOIN (
    SELECT customer_id, COUNT(ord_no) AS orderCount
    FROM orders
    GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_Type = CASE WHEN o.orderCount = 1 THEN 'One-time Customer'
                           WHEN o.orderCount = 2 THEN 'Repeated Customer'
                           WHEN o.orderCount = 3 THEN 'Frequent Customer'
                           ELSE 'Loyal Customer' 
                      END;

Четвертое:

Когда клиент еще ничего не заказал, customerType не обновляется. Вы должны добавить это дело тоже, я думаю. Для этого включите JOIN в LEFT JOIN и добавьте еще один регистр.

UPDATE customer c
LEFT JOIN (
    SELECT customer_id, COUNT(ord_no) AS orderCount
    FROM orders
    GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_Type = CASE WHEN o.orderCount = 1 THEN 'One-time Customer'
                           WHEN o.orderCount = 2 THEN 'Repeated Customer'
                           WHEN o.orderCount = 3 THEN 'Frequent Customer'
                           WHEN o.orderCount IS NULL THEN "hasn't ordered yet"
                           ELSE 'Loyal Customer' 
                      END;

Или, возможно, лучше прочитать:

UPDATE customer c
LEFT JOIN (
    SELECT customer_id, COUNT(ord_no) AS orderCount
    FROM orders
    GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_Type = CASE COALESCE(o.orderCount, 0) 
                           WHEN 0 THEN "hasn't ordered yet"
                           WHEN 1 THEN 'One-time Customer'
                           WHEN 2 THEN 'Repeated Customer'
                           WHEN 3 THEN 'Frequent Customer'
                           ELSE 'Loyal Customer' 
                      END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...