Оператор SQL Update с предложением 2 EXISTS

0

Я пытаюсь обновить значение, которое должно быть 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

  • 1
    Ваш вопрос не ясно для меня, но я уже могу сказать вам, что вы используете exists неправильно. exists не очень важно значение, которое вы выбираете в подзапросе. Он просто проверяет, возвращена ли строка, и останавливается при самом первом поиске. Если вы не укажете предложение where , результат всегда будет истинным, если в таблице есть какая-либо строка.
  • 0
    Из нестандартных цитат я так понял это MySQL?
Показать ещё 2 комментария
Теги:
sql-update
exists

1 ответ

0
Лучший ответ

Ваши подзапросы не связаны с их родительскими запросами, как и должно быть. Давайте посмотрим на ваш внутренний запрос:

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, которые связывают подзапросы с их родительскими запросами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню