sql update语句和2 exists子句

7rfyedvj  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(434)

我正在尝试将一个值更新为null,其中tracker\u unique\u id可以在ab\u split\u tracker\u unique\u链接中找到,而那些ab\u split\u id可以在第三个表ab\u split\u候选中找到。
我不能通过给它不同的值来实现,因为在本地机上,不同用户的值是不同的

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\分割\跟踪器\唯一\链接 tracker_unique_id | ab_split_id 1234 32 ab分离 ab_split_id | reference 32 review_invite_after_enquiry 如果在表ab\u split\u tracker\u unique\u link中找不到tracker,并且ab\u split\u id等于在ab\u split中查询后复查\u invite\u,我想将值设置为null

camsedfj

camsedfj1#

子查询与其父查询没有应有的关联。让我们看看你内心深处的疑问:

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子句,将子查询与其父查询相关联。

相关问题