MySQL错误您可以';t在FROM子句中指定更新的目标表

MySQL错误您可以';t在FROM子句中指定更新的目标表,mysql,subquery,sql-delete,Mysql,Subquery,Sql Delete,我的数据库中有两个表MST_customer和TRN_sales,其中包含损坏的条目。下一个查询将返回损坏的条目: SELECT TRN_sales.cust_no FROM MST_customer RIGHT OUTER JOIN TRN_sales ON MST_customer.cust_no = TRN_sales.cust_no WHERE MST_customer.cust_name IS NULL; 我试图删除它们: DELETE FROM mydbB.TRN_sale

我的数据库中有两个表MST_customer和TRN_sales,其中包含损坏的条目。下一个查询将返回损坏的条目:

SELECT TRN_sales.cust_no 
FROM MST_customer 
RIGHT OUTER JOIN TRN_sales 
ON MST_customer.cust_no = TRN_sales.cust_no 
WHERE MST_customer.cust_name IS NULL;
我试图删除它们:

DELETE FROM mydbB.TRN_sales
WHERE TRN_sales.cust_no IN (
  SELECT TRN_sales.cust_no
  FROM MST_customer
  RIGHT OUTER JOIN TRN_sales
  ON MST_customer.cust_no = TRN_sales.cust_no
  WHERE MST_customer.cust_name IS NULL
);
但我得到了下一个错误:

You can't specify target table 'TRN_sales' for update in FROM clause

如何解决此问题?

为什么不在下面尝试-

DELETE TRN.*
FROM MST_customer MST
RIGHT OUTER JOIN TRN_sales TRN
ON MST.cust_no = TRN.cust_no 
WHERE MST.cust_name IS NULL;
注意:为了安全起见,请在执行此查询之前保留两个表的备份。

为了更详细地说明“安全方面”,您应该指定要从中删除的表(此处:别名
s
):

DELETE s FROM TRN_sales s
LEFT JOIN MST_customers ON MST.cust_no=TRN.cust_no
WHERE MST.cust_name IS NULL;

我个人认为,这个
左连接
更容易阅读,当然你也可以用你的
右连接
版本做同样的事情。

你不需要
*
从…删除TRN
也会起作用。@cars10:请你详细说明“删除s”比“删除TRN.*”更安全…是的,left join更容易阅读,但我只是对Rin的查询进行了处理,使他感觉很轻松,因为这与他的查询一样…但如果使用left join或right join,这两种方式都没有问题。嗨,Zafar,你的答案(而且一直)100%正确!当我写我的答案时,我误解了你的
TRN.*
是指整个数据库。事实并非如此,因为您只参考有关的销售表是正确的。因此,从我的观点来看,你的答案仍然是正确的,应该是“被选中的人”,因为它首先出现在这里。我保留我的答案的唯一原因是用
LEFT JOIN
而不是
RIGHT JOIN
显示另一种方法。我只是“增加”了你的帖子…;-)@cars10:不,一点也不,我只是想知道alias是否有什么重大影响。*并且只是alias在join下删除了。:)