#mysql #sql-update #inner-join #distinct #exists
Вопрос:
У меня есть столбец в таблице, который я хочу установить в значение true или false на основе условий в другой таблице, которая связана только с первой таблицей через третью таблицу. Первая таблица представляет собой таблицу развертываний, вторая таблица содержит сообщения для каждого развертывания (много сообщений на развертывание), а третья таблица содержит msg_data, которые поступают только из определенных сообщений. Не все развертывания будут включать сообщения data_msg, но если они будут, я хочу установить для столбца в таблице развертывания значение TRUE. Я создал представление таблицы, в котором показаны все строки, в которых для этого столбца должно быть установлено значение true:
CREATE VIEW condition_true AS
SELECT DISTINCT deployment.id, deployment.condition
FROM deployment
JOIN messages ON messages.deployment_id = deployment.id
JOIN data_msgs ON data_msgs.messages_id = messages.id
GROUP BY deployment.id;
Это представление само по себе не подлежит обновлению по нескольким причинам, но, очевидно, я хотел бы сделать следующее
UPDATE condition_true
SET condition_true.condition = TRUE;
Кто-нибудь может помочь мне понять, как этого добиться?
Спасибо.
Ответ №1:
Предполагая , что id
это первичный ключ deployment
, вам нужна UPDATE
инструкция с объединениями 3 таблиц:
UPDATE deployment d
JOIN messages m ON m.deployment_id = d.id
JOIN data_msgs dm ON dm.messages_id = m.id
SET d.condition = true
Или, с EXISTS
:
UPDATE deployment d
SET d.condition = true
WHERE EXISTS (
SELECT 1
FROM messages m JOIN data_msgs dm
ON dm.messages_id = m.id
WHERE m.deployment_id = d.id
)
Или, если вы хотите установить для столбца значение TRUE
или FALSE
:
UPDATE deployment d
SET d.condition = EXISTS (
SELECT 1
FROM messages m JOIN data_msgs dm
ON dm.messages_id = m.id
WHERE m.deployment_id = d.id
)
Кроме того, на ваш взгляд, в этом нет необходимости GROUP BY deployment.id
, потому что вы не выполняете никакой агрегации и используете DISTINCT
, поэтому вы не получите никаких повторяющихся строк..
Комментарии:
1. Спасибо, это отлично работает, хотя я столкнулся с проблемой размера таблицы блокировки, которую мне теперь нужно решить.
2. @Kat Проверьте мой 2-й запрос.
3. Спасибо вам за дополнительные техники, это очень полезно. Я просто изучаю SQL.