带有2个EXISTS子句的SQL Update语句

时间:2018-01-17 15:31:49

标签: mysql sql sql-update exists

我正在尝试将值更新为NULL,其中tracker_unique_id可以在ab_split_tracker_unique_link中找到,其中ab_split_id可以在第3个表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

Ab Split
ab_split_id | reference 32 review_invite_after_enquiry

如果在表ab_split_tracker_unique_link中找不到跟踪器,并且ab_split_id等于ab_split中的review_invite_after_enquiry

,我想将值设置为null

1 个答案:

答案 0 :(得分: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无关。

所以你要么更新所有记录,要么都没有。

我们宁愿期待像

这样的东西
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子句。