Я пытаюсь обновить значение, которое должно быть NULL, где tracker_unique_id можно найти в ab_split_tracker_unique_link, где эти ab_split_id можно найти в третьей таблице ab_split_candidate.
Я не могу сделать это, указав разные значения, поскольку они могут отличаться от пользователя к пользователю на локальных языках
UPDATE trustpilot_links SET 'invite_after_enquiry' = NULL
WHERE EXISTS (
SELECT tracker_unique_id, ab_split_tracker_unique_link.ab_split_candidate_id
FROM ab_split_tracker_unique_link
WHERE EXISTS (
SELECT ab_split_candidate_id
FROM ab_split_candidate LEFT JOIN ab_split
ON ab_split_candidate.ab_split_id = ab_split.ab_split_id WHERE ab_split.reference="review_invite_after_enquiry"
)
);
Редактировать:
Примеры таблиц
Ссылки Trustpilot
trustpilot_link_id | invite_after_enquiry | tracker_unique_id 1 1 123 2 0 1234
ab_split_tracker_unique_link tracker_unique_id | ab_split_id 1234 32
tracker_unique_id | ab_split_id 1234 32
Ab Split ab_split_id | reference 32 review_invite_after_enquiry
Я хочу установить значения равными нулю, если трекер не может быть найден в таблице ab_split_tracker_unique_link с помощью ab_split_id, который равен review_invite_after_enquiry в ab_split
Ваши подзапросы не связаны с их родительскими запросами, как и должно быть. Давайте посмотрим на ваш внутренний запрос:
SELECT ab_split_candidate_id
FROM ab_split_candidate
LEFT JOIN ab_split ON ab_split_candidate.ab_split_id = ab_split.ab_split_id
WHERE ab_split.reference = 'review_invite_after_enquiry'
Ну, в первую очередь ваше WHERE
отклоняет внешние записи, так что это, по сути, INNER JOIN
. Но тогда: либо есть такие записи, либо нет. Это не имеет ничего общего с записью, которую вы потенциально обновляете, ни с помощью ab_split_tracker_unique_link
, с ab_split_tracker_unique_link
вы смотрите.
Поэтому либо вы обновляете все записи, либо ничего.
Мы предпочли бы ожидать чего-то вроде
UPDATE trustpilot_links tl
SET invite_after_enquiry = NULL
WHERE EXISTS
(
SELECT *
FROM ab_split_tracker_unique_link stul
WHERE stul.tracker_unique_id = tl.tracker_unique_id
AND ...
);
Поэтому добавьте предложения WHERE, которые связывают подзапросы с их родительскими запросами.
exists
неправильно.exists
не очень важно значение, которое вы выбираете в подзапросе. Он просто проверяет, возвращена ли строка, и останавливается при самом первом поиске. Если вы не укажете предложениеwhere
, результат всегда будет истинным, если в таблице есть какая-либо строка.