2015-02-08 102 views
0

第一個查詢提供了應該刪除的一組ID。第二個查詢嘗試刪除它們。無法從MySQL表中刪除集合

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 

爲什麼不能像這樣指定目標表?

回答

1

你不能deletetable參考同桌的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 
+0

您的第一個查詢返回'每個派生表必須具有其自己的別名'第二個查詢工作!謝謝。 – 4m1r 2015-02-08 02:54:47

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表twi更簡單CE:

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

這將刪除行中abstracts有一個pmid不在erpubtbl - 這是我如何讀你的原始查詢。

+0

第一個查詢工作,但第二個查詢似乎只是旋轉。謝謝。 – 4m1r 2015-02-08 02:56:18

+0

@ 4m1r。 。 。這太有趣了。除非桌子上有鎖,否則我想不出第二個會如何掛起。但很高興第一個人工作。 – 2015-02-08 15:10:58