2009-12-08 64 views
8

加入似乎无法锻炼什么即时做错了问题删除行MySQL中

SELECT * FROM tbl_imagelabel LEFT OUTER JOIN tbl_image ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL

显示我想要删除的确切行。但如果我改变SELECT * FROM要删除它不工作

DELETE FROM tbl_imagelabel LEFT OUTER JOIN tbl_image ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL

+0

是否有错误讯息? – Bobby 2009-12-08 17:22:47

+0

在'DELETE'查询前运行'EXPLAIN EXTENDED'并在此处粘贴输出。 – 2009-12-08 17:26:29

回答

10

你试图从多个表中与语法单个查询删除。尝试更多的东西一样(这只是一个松散的例子,并不意味着进行优化或任何东西):

DELETE FROM tbl_imagelabel 
WHERE label_id IN (
    SELECT tbl_imagelabel.label_id 
    FROM tbl_imagelabel 
    LEFT OUTER JOIN tbl_image 
     ON tbl_imagelabel.label_id = tbl_image.label_id 
    WHERE tbl_image.label_id IS NULL 
) 
+0

34秒使所有区别:-) – cdonner 2009-12-08 17:27:28

+0

LoL ...我知道... +1为解决方案的任何一种方式:D – 2009-12-08 17:28:24

+0

高兴地返回优惠:-) – cdonner 2009-12-08 17:28:56

4
DELETE FROM tbl_imagelabel 
where label_id IN 
(
SELECT tbl_imagelabel.label_id FROM tbl_imagelabel 
LEFT OUTER JOIN tbl_image 
ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL 
) 

假设label_id是唯一的主键。

6

我相信这没有明确的联接做同样的事情。

DELETE FROM tbl_imagelabel 
WHERE label_id NOT IN (SELECT label_id FROM tbl_image) 
+0

+1好抓! (党15个字符限制评论) – 2009-12-08 17:33:12

3

虽然这里给出的所有的答案提供了解决这个问题给出了具体的例子的替代手段,他们都这样做实际上不包括左外DELETE语句明确地加入。要做到这一点,你需要的 '使用' 声明如下:

DELETE FROM til USING tbl_imagelabel as til LEFT OUTER JOIN tbl_image as ti 
ON til.label_id = ti.label_id WHERE ti.label_id is NULL 

参考文献:

8

获得进一步的参考,在MySQL 5+:

DELETE tbl1.* FROM tbl1 LEFT JOIN tbl2 USING(fld) WHERE tbl2.fld IS NULL; 

它会删除任何orph ans on TBL1使用fld as join。

GL Paulo Bueno