Предложение SET
выглядит правильно.Но это неверное утверждение;похоже, нам не хватает ключевого слова UPDATE
, имя обновляемой таблицы.
Если мы хотим изменить ТОЛЬКО строки, в которых room_value
уникален, мы могли бы сделать что-то вроде этого:
UPDATE mytable t
JOIN ( SELECT r.room_value
, COUNT(*) AS cnt
FROM mytable r
GROUP BY r.room_value
) s
ON s.room_value = t.room_value
SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE t.room_is_private END
Выполнено встроенное представление s
, и результаты материализуются как производная таблица.Это дает нам различные значения room_value
вместе с количеством строк с одинаковым room_value
.
Затем мы присоединяем производную сказку к исходной таблице, сопоставляя ее по столбцу room_value
, поэтому теперьдля каждой строки в нашей таблице мы можем знать количество строк, имеющих одинаковый room_value
.
В предложении SET
мы используем выражение, которое проверяет счет и условно присваивает 1
(когда cnt=1
) и в противном случае оставляет значение room_is_private
без изменений.
Я подозреваю, что мы, вероятно, также хотим установить room_is_private
= 0, когда room_value не является уникальным, поэтому вместо того, чтобы устанавливать room_is_private
на текущее значение (т.е. оставить его без изменений), мы бы вместо этого присвоили 0
.
UPDATE mytable t
JOIN ( SELECT r.room_value
, COUNT(*) AS cnt
FROM mytable r
GROUP BY r.room_value
) s
ON s.room_value = t.room_value
SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE 0 END