错误例子:
DELETE FROM t_mercadolibre_tag_sub_mapping
WHERE sku IN (
SELECT sku FROM (
SELECT a.sku
FROM t_mercadolibre_tag_sub_mapping a
LEFT JOIN rb_p_product_prohibitionsalemarket c ON c.sku = a.sku
WHERE a.tag_id between 17586 and 17759
) AS subquery
);
原因:
SQL 查询中包含了一个子查询,在这个子查询中,你使用了 LEFT JOIN 来连接 t_mercadolibre_tag_sub_mapping 表和 rb_p_product_prohibitionsalemarket 表,然后在 WHERE 子句中过滤了符合条件的记录。但是,由于 LEFT JOIN 的特性,即使在右表 rb_p_product_prohibitionsalemarket 中找不到匹配的记录,左表 t_mercadolibre_tag_sub_mapping 中的相应记录也会被包含在结果中,并且在右表中没有匹配的地方会被填充为 NULL。
因此,当你在 WHERE 子句中将条件限制在 a.tag_id 的范围内时,对于左表 t_mercadolibre_tag_sub_mapping 中的每个记录,只要其 tag_id 落在指定范围内,无论是否在右表中找到匹配的记录,它们都会被包括在结果中。这可能导致了你意外删除了整个子表。
要解决这个问题,你可以将子查询中的条件稍作修改,以确保只有在右表中找到匹配的记录才会被删除。你可以尝试使用 EXISTS 子查询来实现这一点,或者直接使用 INNER JOIN 而不是 LEFT JOIN。例如:
DELETE
from t_mercadolibre_tag_sub_mapping t1
where exists (
SELECT 1 from rb_p_product_prohibitionsalemarket t2 where t2.CustomerID=1 and t1.sku=t2.SKU
)
DELETE FROM t_mercadolibre_tag_sub_mapping
WHERE EXISTS (
SELECT 1
FROM rb_p_product_prohibitionsalemarket c
WHERE c.sku = t_mercadolibre_tag_sub_mapping.sku
)
AND tag_id BETWEEN 17586 AND 17759;
DELETE FROM t_mercadolibre_tag_sub_mapping
WHERE sku IN (
SELECT a.sku
FROM t_mercadolibre_tag_sub_mapping a
INNER JOIN rb_p_product_prohibitionsalemarket c ON c.sku = a.sku
WHERE a.tag_id BETWEEN 17586 AND 17759
);