这个SQL DELETE FROM语法有什么问题?

Bry*_*ock 4 mysql sql

我正在尝试删除96k记录.

删除表xoops_bb_posts_text页面中没有匹配的post_id到xoops_bb_posts的所有记录

此查询返回91k记录:

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 
   );  
Run Code Online (Sandbox Code Playgroud)

当我试图删除那些记录时,我得到了语法错误,但我没有看到它.

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 
);  
Run Code Online (Sandbox Code Playgroud)

错误在哪里?

错误

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  
)  
Run Code Online (Sandbox Code Playgroud)

MySQL说:文档

#1064 - 您的SQL语法有错误; 检查与您的MySQL服务器版本对应的手册,以便在'WHERE not exists'附近使用正确的语法(从第2行的xoops_bb_posts p WHERE p.post_id = t.post_中选择post_id)

Tim*_*Tim 10

如果在删除调用中对别名进行别名,则必须使用别名作为参数:

DELETE alias FROM tablerealname as ALIAS ...

所以在OP的原始问题中,他只需在DELETE之后添加别名:

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  
)  
Run Code Online (Sandbox Code Playgroud)

  • 不,这里的"AS"不是问题.你只需要使用`DELETE t FROM ...`,有或没有`AS`. (3认同)

Asa*_*aph 7

对我来说,通过使用delete带有a的语句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;
Run Code Online (Sandbox Code Playgroud)

或者只是更改您的查询:

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 );
Run Code Online (Sandbox Code Playgroud)

  • 提问者并不是在寻找一种新的方法来构建他的查询,他只是在询问语法错误是什么. (2认同)