web-dev-qa-db-ja.com

WHERE条件の別のテーブルにJOINを使用したSQL DELETE

guideテーブルとの関係がない(死んだ関係)guide_categoryから行を削除する必要があります。

これが私がやりたいことですが、もちろんうまくいきません。

DELETE FROM guide_category AS pgc 
 WHERE pgc.id_guide_category IN (SELECT id_guide_category 
                                   FROM guide_category AS gc
                              LEFT JOIN guide AS g ON g.id_guide = gc.id_guide
                                  WHERE g.title IS NULL)

エラー:

FROM句で更新するターゲットテーブル 'guide_category'を指定できません

70
hsz

ロックの実装の問題により、MySQLは、DELETEまたはUPDATEで影響を受けるテーブルを参照することを許可しません。

代わりに、ここでJOINを作成する必要があります。

DELETE  gc.*
FROM    guide_category AS gc 
LEFT JOIN
        guide AS g 
ON      g.id_guide = gc.id_guide
WHERE   g.title IS NULL

または単にNOT INを使用します:

DELETE  
FROM    guide_category AS gc 
WHERE   id_guide NOT IN
        (
        SELECT  id_guide
        FROM    guide
        )
105
Quassnoi

あなたの説明から、以下で十分だと思います:

DELETE FROM guide_category 
WHERE id_guide NOT IN (SELECT id_guide FROM guide)

関係するテーブルに参照整合性制約がないと思いますか?

9
Dirk

簡単に理解するには、このサンプルSQLスクリプトを試してください。

CREATE TABLE TABLE1 (REFNO VARCHAR(10))
CREATE TABLE TABLE2 (REFNO VARCHAR(10))

--TRUNCATE TABLE TABLE1
--TRUNCATE TABLE TABLE2

INSERT INTO TABLE1 SELECT 'TEST_NAME'
INSERT INTO TABLE1 SELECT 'KUMAR'
INSERT INTO TABLE1 SELECT 'SIVA'
INSERT INTO TABLE1 SELECT 'SUSHANT'

INSERT INTO TABLE2 SELECT 'KUMAR'
INSERT INTO TABLE2 SELECT 'SIVA'
INSERT INTO TABLE2 SELECT 'SUSHANT'

SELECT * FROM TABLE1
SELECT * FROM TABLE2

DELETE T1 FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.REFNO = T2.REFNO

あなたのケースは:

   DELETE pgc
     FROM guide_category pgc 
LEFT JOIN guide g
       ON g.id_guide = gc.id_guide 
    WHERE g.id_guide IS NULL
4
user2384628