Что не так с этим синтаксисом SQL DELETE FROM? - PullRequest
4 голосов
/ 06 декабря 2011

Я пытаюсь удалить записи 96k.

удалить все записи на страницах таблицы xoops_bb_posts_text, у которых нет соответствующих post_id для xoops_bb_posts

Этот запрос работал, возвращая 91 тыс. Записей:

SELECT *  
   FROM xoops_bb_posts_text t  
   WHERE not exists (
       select post_id 
           from xoops_bb_posts p 
           WHERE p.post_id = t.post_id 
   );  

когда я пытался удалить эти записи, я получил синтаксическую ошибку, но я ее не вижу.

DELETE FROM xoops_bb_posts_text t  
WHERE not exists (
    select post_id 
       from xoops_bb_posts p 
    WHERE p.post_id = t.post_id 
);  

Где ошибка?

Ошибка

SQL-запрос: Документация

DELETE FROM xoops_bb_posts_text t 
   WHERE NOT EXISTS (  
      SELECT post_id  
         FROM xoops_bb_posts p  
         WHERE p.post_id = t.post_id  
)  

MySQL сказал: Документация

# 1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного использования синтаксиса около 'ГДЕ не существует (выберите post_id из xoops_bb_posts p ГДЕ p.post_id = t.post_ 'в строке 2

Ответы [ 7 ]

10 голосов
/ 06 декабря 2011

Если вы используете таблицы псевдонимов в вызове удаления, вы должны использовать псевдоним в качестве аргумента:

DELETE alias FROM tablerealname as ALIAS ...

Так что в исходном вопросе OP он просто должен добавить псевдонимпосле УДАЛЕНИЯ:

DELETE t FROM xoops_bb_posts_text as t WHERE NOT EXISTS (  
SELECT post_id  
FROM xoops_bb_posts as p  
WHERE p.post_id = t..post_id  
)  
7 голосов
/ 06 декабря 2011

Для меня эту проблему легче решить с помощью оператора delete с outer join и поиска строк, которые не совпадают. Примерно так:

delete t from xoops_bb_posts_text as t
left outer join xoops_bb_posts as p
on p.post_id = t.post_id
where p.post_id is null;

или просто изменив свой запрос:

DELETE t
FROM xoops_bb_posts_text t  
WHERE not exists 
      (select post_id from xoops_bb_posts p WHERE p.post_id = t.post_id );
1 голос
/ 06 декабря 2011

Вы не можете использовать псевдонимы таблиц в одной таблице DELETE в MySql Вам нужно использовать полное имя таблицы, например:

DELETE FROM xoops_bb_posts_text
WHERE not exists (select post_id from xoops_bb_posts p WHERE p.post_id = xoops_bb_posts_text.post_id );
0 голосов
/ 14 февраля 2018
CREATE TABLE IF NOT EXISTS `tbl_student1` (
  `stud_id` int(11) NOT NULL AUTO_INCREMENT,
  `stud_name` varchar(255) CHARACTER SET utf8 NOT NULL,
  `stream_id` int(11) NOT NULL,
  `address` varchar(255) CHARACTER SET utf8 NOT NULL,
  `s_date` datetime NOT NULL,
  `status` int(11) NOT NULL,
  PRIMARY KEY (`stud_id`),
  FOREIGN KEY ('stream_id')
        REFERENCES tbl_stream ('stream_id')
        ON DELETE CASCADE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
0 голосов
/ 06 декабря 2011

Из моего комментария:

DELETE FROM xoops_bb_posts_text t  
 WHERE NOT EXISTS (
    SELECT * 
      FROM xoops_bb_posts p 
     WHERE p.post_id = t.post_id 
);  
0 голосов
/ 06 декабря 2011

Я не знаю синтаксис "EXISTS". Я думаю, что лучше использовать «в» и «не в»

Попытка:

DELETE FROM xoops_bb_posts_text WHERE post_id not in (SELECT post_id  FROM xoops_bb_posts)
0 голосов
/ 06 декабря 2011

Нельзя указывать псевдоним таблицы в операторе удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...