Подтвердить что ты не робот

SQL DELETE с добавлением другой таблицы для условия WHERE

Мне нужно удалить строки из guide_category, которые не имеют отношения к таблице guide (мертвые отношения).

Вот что я хочу сделать, но это, конечно, не работает.

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)

Ошибка:

Вы не можете указать целевую таблицу 'guide_category' для обновления в предложении FROM

4b9b3361

Ответ 1

Из-за проблем с реализацией блокировки 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
        )

Ответ 2

Я думаю, из вашего описания было бы достаточно:

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

Я предполагаю, что нет ограничений ссылочной целостности для задействованных таблиц?

Ответ 3

Попробуйте этот образец 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

Как насчет:

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

  )