2009-12-08 9 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

+0

'DELETE'クエリの前に' EXPLAIN EXTENDED'を実行し、ここに出力を貼り付けます。 –

答えて

10

仕事doesntの。より多くのようなものを試してみてください(これはちょうど緩い一例であり、最適化されたか、何を意味するものではない):そのlabel_idを想定し

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

+0

LoL ...知っています...どちらかの方法で解決策を+1してください:D –

+0

好意を返すことを嬉しく思います:-) – cdonner

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 
) 

は、一意の主キーです。

6

私はこれが明示的な結合なしで同じことをすると信じています。ここで与えられたすべての答えながら

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

+1良いキャッチ! (コメントに15文字の制限があります) –

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 

参考文献::、5+ MySQLの上futher参考

8

次のようにそれを行うには、 'を使用して' ステートメントを必要とします
DELETE tbl1.* FROM tbl1 LEFT JOIN tbl2 USING(fld) WHERE tbl2.fld IS NULL; 

すべてのorphを削除しますans on TBL1fldをjoinとして使用します。

GL パウロ・ブエノ