MySQL Update столбец с регистром на соединенных таблицах не работает - PullRequest
0 голосов
/ 26 января 2019

Сначала я создал таблицу «клиенты».Затем я обновил «клиентов» еще одним атрибутом «cust_level».У меня есть еще одна таблица «Заказы».Теперь я хочу обновить уровень cust_level для таблицы «customer» на основе количества «order» в таблице «orders».Но когда я пытался обновить таблицу «Клиенты», я получаю следующую ошибку:

0 затронутых строк: Соответствие строк: 10 Изменено: 0 Предупреждений: 0

Спасибо за любую помощь!

create table customers(
    customer_id    varchar(20),
    PRIMARY KEY (customer_id)
);

ALTER TABLE customers ADD cust_level CHAR(1);

create table orders(
    order_id    int,
    order_no        varchar(10),
    quantity    int,
    order_date      date,
    delivery_date   date,
    customer_id    varchar(20),
    PRIMARY KEY(order_id),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

update  customers C
left join
    (
        select customer_id,sum(quantity) as total_purchase from orders group by customer_id
    ) A on C.customer_id=A.customer_id
set C.cust_level =  case
        when A.total_purchase>2  then C.cust_level='3'
        when A.total_purchase>0 and A.total_purchase<3 then C.cust_level='2'
        else C.cust_level='1'
end

1 Ответ

0 голосов
/ 26 января 2019
SET C.cust_level = CASE
    WHEN A.total_purchase>2 THEN C.cust_level='3'
    WHEN A.total_purchase>0 AND A.total_purchase<3 THEN >C.cust_level='2'
    ELSE C.cust_level='1'
END

Это выражение CASE имеет проблему. Вы указываете, какой столбец должен обновляться до CASE (SET C.cust_level = ...), но ссылаетесь на них внутри CASE (... THEN C.cust_level = '3'). CASE должен вернуть единственное значение, которое будет присвоено указанному столбцу.

Это должно быть написано:

SET C.cust_level = CASE
    WHEN A.total_purchase > 2 THEN '3'
    WHEN A.total_purchase > 0 AND A.total_purchase < 3 THEN '2'
    ELSE '1'
END

Наконец: КОГДА условия оцениваются одно за другим, и CASE останавливается на первом совпадении. Таким образом, хотя функциональность эквивалентна, это можно упростить как:

SET C.cust_level = CASE
    WHEN A.total_purchase > 2 THEN '3'
    WHEN A.total_purchase > 0 THEN '2'
    ELSE '1'
END
...