LEFT JOIN 子查询可能引发的误删数据

文章讨论了在执行DELETE操作时,由于使用LEFTJOIN导致的误删问题,建议使用EXISTS或INNERJOIN来确保只删除右表有匹配的记录。修正后的SQL示例包含在内。
摘要由CSDN通过智能技术生成

错误例子:

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
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值