Впишите это как SELECT
.
Начните с простого, мы знаем, что мы хотим обновить строки group_id=3
и visible=1
, поэтому напишите запрос, который получит все эти строки:
SELECT g3.value
, g3.visible
FROM mytable g3
WHERE g3.group_id = 3
AND g3.visible = 1
Мы знаем, что строки, которые мы хотим обновить, находятся в этом наборе, но есть некоторые дополнительные условия.
Итак, мы расширяем это. В соответствии со спецификацией, нам нужно выяснить, есть ли какие-либо подходящие строки group_id=1
, visible=1
(соответствующие value
).
Мы можем сделать эту проверку либо с помощью коррелированного подзапроса EXISTS
, либо с помощью JOIN
.
SELECT g3.group_id
, g3.value
, g3.visible
FROM mytable g3
WHERE g3.group_id = 3
AND g3.visible = 1
AND EXISTS ( SELECT 1
FROM mytable g1
WHERE g1.group_id = 1
AND g1.visible = 1
AND g1.value = g3.value
)
-или-
SELECT g3.group_id
, g3.value
, g3.visible
FROM mytable g3
JOIN mytable g1
ON g1.group_id = 1
AND g1.visible = 1
AND g1.value = g3.value
WHERE g3.group_id = 3
AND g3.visible = 1
Убедитесь, что запрос возвращает строки, которые мы хотим обновить, при определенных условиях. (Гораздо проще проверить результаты оператора SELECT
и, при необходимости, настроить его, чем оператор UPDATE
.)
После того как запрос SELECT
работает и проверен (возвращает строки, которые мы хотим обновить), мы можем преобразовать его в оператор UPDATE
. Замените SELECT ... FROM
на UPDATE
и добавьте предложение SET
, которое возвращает строки
UPDATE mytable g3
JOIN mytable g1
ON g1.group_id = 1
AND g1.visible = 1
AND g1.value = g3.value
SET g3.visible = 0
WHERE g3.group_id = 3
AND g3.visible = 1