无法从MySQL表中删除set中的位置

时间:2015-02-08 02:27:28

标签: mysql sql

第一个查询提供了应删除的一组ID。第二个查询尝试删除它们。

select abstracts.pmid from abstracts where abstracts.pmid not in 
(select pmid from erpubtbl);

//Fine 555,556,...

delete from abstracts where (pmid) IN (
    select abstracts.pmid from abstracts where abstracts.pmid not in 
    (select pmid from erpubtbl)
);

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

为什么不能像这样指定目标表?

2 个答案:

答案 0 :(得分:1)

您不能delete来自table参考 subquery中的同一张表。

可能这个技巧应该可以帮到你

DELETE FROM abstracts
WHERE  ( pmid ) IN (SELECT *
                    FROM   (SELECT abstracts.pmid
                            FROM   abstracts
                            WHERE  abstracts.pmid NOT IN (SELECT pmid
                                                          FROM   erpubtbl))a);

甚至是Inner Join

DELETE FROM abstracts
USING abstracts
INNER JOIN (SELECT abstracts.pmid
            FROM   abstracts
            WHERE  abstracts.pmid NOT IN (SELECT pmid
                                          FROM   erpubtbl) 
            ) b
         ON abstracts.pmid = b.pmid

答案 1 :(得分:1)

在MySQL中执行此操作的一种方法是使用join

delete a
    from abstracts a join
         (select a2.pmid
          from abstracts a2
          where a2.pmid not in (select pmid from erpubtbl)
         ) aa
         on a.pmid = aa.pmid;

但是,我认为这更简单,没有提到abstracts表两次:

delete a
    from abstracts a left join
         erpubtbl e
         on a.pmid = e.pmid
    where e.pmid is null;

这将删除abstractspmid不在erpubtbl中的行 - 这就是我阅读原始查询的方式。