使用INNER JOIN删除SQL


120

有2个表,spawnlistnpc,并且我需要从中删除数据spawnlsitnpc_templateid = n.idTemplate是唯一“连接”表的东西。我已经尝试过此脚本,但是它不起作用。

我已经试过了:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

1
更令人惊讶的是,通常L2社区会保持自我。阅读问题并思考“看起来像……嗯……是!”有点奇怪。:)
Corbin

1
@Corbin我完全明白你的意思。有趣的是,我正在获得有关工作项目的L2问题的帮助。
MarcoAurélioDeleu '16

从t1.id = t2.id上的table1 t1内部联接table2 t2中的table1中删除;详细信息youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Answers:


224

在第一行中添加.*s

尝试:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

这是我得到的错误:[Err] 1064-您的SQL语法有错误;在第1行[Err] DELETE l2revo.root中,检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“ spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t”附近使用。从db.root.spawnlist的INNER JOIN派生列表db.root.npc n ON s.npc_templateid = n.idTemplate WHERE(n.type =“ monster”); [Msg]已完成-未成功-------------------------------------------- ------
JoinOG

在您的错误中,您似乎在使用两个不同的服务器名称spawnlist。我看到的l2revo.root.spawnlistdb.root.spawnlist
ThinkingStiff

我只是在将其粘贴到此处时犯了一个错误,但是用户名和数据库名相同,这是我的错误。
JoinOG

尝试添加AS别名。
ThinkingStiff

4
@GauravRamanan s。*告诉mysql要删除的内容,您不想从JOINED表中删除行
Julz

12

如果数据库是InnoDB,那么最好使用外键并在删除时级联,这将是您想要的,并且不会导致存储冗余数据。

但是对于本示例,我认为您不需要第一个:

DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster";

在删除之前选择行可能是一个更好的主意,因此您可以确定要删除的内容:

SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";

您还可以在此处检查MySQL删除语法:http : //dev.mysql.com/doc/refman/5.0/en/delete.html


这是我得到的错误:[Err] 1064-您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在的附近使用INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type =“ monste”在第1行[Err]从生成列表中删除INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type =“ monster”; [Msg]已完成-未成功------------------------ --------------------------
JoinOG 2011年

改变了,现在可能会更成功?

错误:[错误] 1066-不是唯一的表/别名:'npc'[错误]从派生列表中删除派生列表,npc内联接npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type =“ monster”; [Msg]已完成-未成功-------------------------------------------- ------
JoinOG

如果只运行一次,则可能会效率极低:从生成列表中删除WHERE npc_templateid IN(从npc中选择idTemplate,WHERE type =“ monster”);
科尔宾

这是我的最后一次尝试,如果您仅从联接中的一个表中删除,那么我将看不到为什么不起作用。

6

如果数据库是InnoDB,则不需要删除联接。只要

DELETE FROM spawnlist WHERE spawnlist.type = "monster";

可用于删除与其他表中的外键链接的所有记录,为此,您必须在设计时首先链接表。

CREATE TABLE IF NOT EXIST spawnlist (
  npc_templateid VARCHAR(20) NOT NULL PRIMARY KEY

)ENGINE=InnoDB;

CREATE TABLE IF NOT EXIST npc (
  idTemplate VARCHAR(20) NOT NULL,

  FOREIGN KEY (idTemplate) REFERENCES spawnlist(npc_templateid) ON DELETE CASCADE

)ENGINE=InnoDB;

如果您使用MyISAM,则可以删除像这样加入的记录

DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';

在第一行中,我已经初始化了两个临时表以删除记录,在第二行中,我已经将存在表分配给了a和b,但是在这里,我已将两个表与join关键字链接在一起,并且已经将主键和外键匹配了对于构成链接的两个表,在最后一行中,我已按要删除的字段过滤了记录。


type实际上在另一个表中,而不是在spawnlist表中,因此必须进行连接
vivo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.