SQL DELETE com JOIN outra tabela para WHERE condition

Eu tenho que excluir linhas de guide_category que não têm relação com a tabela de guide (relações mortas).

Aqui está o que eu quero fazer, mas é claro que não funciona.

 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) 

Erro:

Você não pode especificar a tabela de destino ‘guide_category’ para atualização na cláusula FROM

Devido aos problemas de implementação de bloqueio, o MySQL não permite referenciar a tabela afetada com DELETE ou UPDATE .

Você precisa fazer um JOIN aqui:

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

ou apenas use um NOT IN :

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

Eu acho que, da sua descrição, o seguinte seria suficiente:

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

Eu assumo que não há restrições de integridade referencial nas tabelas envolvidas, existem?

Experimente este exemplo de scripts SQL para facilitar a compreensão

 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 

Seu caso é:

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

E se:

 DELETE guide_category WHERE 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 )