SQL 包含 2 个 EXISTS 子句的更新语句
SQL Update statement with 2 EXISTS clause
我正在尝试将一个值更新为 NULL,其中 tracker_unique_id 可以在 ab_split_tracker_unique_link 中找到,而 ab_split_id 可以在第三个 table 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"
)
);
编辑:
Table 个例子
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 拆分
ab_split_id | reference
32 review_invite_after_enquiry
如果在 table ab_split_tracker_unique_link 中找不到跟踪器,我想将值设置为 null,ab_split_id 等于 ab_split 中的 review_invite_after_enquiry ]
您的子查询与其父查询不相关,因为它们应该相关。让我们看看您最内在的查询:
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
无关。
因此,要么您要更新所有记录,要么 none。
我们宁愿期待
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 子句。
我正在尝试将一个值更新为 NULL,其中 tracker_unique_id 可以在 ab_split_tracker_unique_link 中找到,而 ab_split_id 可以在第三个 table 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"
)
);
编辑:
Table 个例子
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 拆分
ab_split_id | reference
32 review_invite_after_enquiry
如果在 table ab_split_tracker_unique_link 中找不到跟踪器,我想将值设置为 null,ab_split_id 等于 ab_split 中的 review_invite_after_enquiry ]
您的子查询与其父查询不相关,因为它们应该相关。让我们看看您最内在的查询:
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
无关。
因此,要么您要更新所有记录,要么 none。
我们宁愿期待
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 子句。