2014-10-28 93 views
0

我在執行子查詢時遇到問題,以便刪除我的應用程序中的某些特定行。這是我錯誤的SQL:用於刪除行的MySQL子查詢

delete from player_news_items 
    where id IN 
     (select id from player_news_items 
     where player_id NOT IN (select id from players)); 

什麼是寫這個查詢的正確方法?

回答

3

在MySQL中,除非使用join,否則不能引用updatedelete中正在修改的表。不過,我覺得你可能只是想這樣的:

delete pni 
    from player_news_items pni 
    where player_id NOT IN (select id from players)); 

作爲一個說明,我會建議寫這與not exists

delete pni 
    from player_news_items pni 
    where not exists (select 1 from players p where p.player_id = pni.player_id); 
+1

不,我不同意,但爲什麼會在第二種形式是更優選寫查詢的方式?第一種形式更簡潔,*看起來像它應該更快。 – zebediah49 2014-10-28 16:30:46

+0

作爲一個新人,我想問一下NOT IN和EXISTS之間是否存在性能差異?當然,@ zebediah49它看起來更快,但是它更快? – AdamMc331 2014-10-28 16:32:24

+1

@ McAdam331。 。 。在一些數據庫中,「not exists」比「not in」更有效。更重要的是,如果'players.id'是'NULL',那麼第一個版本將永遠不會返回任何值。 'Not exists'實際上比'NOT IN'更直觀地處理NULL。 – 2014-10-28 17:38:13