SQL DELETE com INNER JOIN

120

Existem 2 tabelas spawnliste npc, e preciso excluir os dados de spawnlsit. npc_templateid = n.idTemplateé a única coisa que "conecta" as mesas. Eu tentei este script, mas não funciona.

Eu tentei isso:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
JoinOG
fonte
1
Ficou mais surpreso porque, normalmente, a comunidade L2 se mantém isolada. Foi um pouco estranho ler a pergunta e pensar "isso parece ... hmm ... é!" :)
Corbin
1
@Corbin Eu entendo totalmente o que você quer dizer. Curiosamente, estou recebendo ajuda em uma questão de L2 para um projeto de trabalho.
Marco Aurélio Deleu
Excluir da tabela1 da tabela1 t1 junção interna da tabela2 t2 em t1.id = t2.id; em detalhes youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Respostas:

224

Adicione .*a sem sua primeira linha.

Experimentar:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
ThinkingStiff
fonte
Aqui está o erro que recebi: [Err] 1064 - Você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para obter a sintaxe correta para usar próximo a 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' na linha 1 [Err] DELETE l2revo.root. spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monstro"); [Msg] Concluído - Sem sucesso -------------------------------------------- ------
JoinOG
No seu erro, parece que você está usando dois nomes de servidor diferentes para spawnlist. Eu vejo l2revo.root.spawnliste db.root.spawnlist.
ThinkingStiff
Acabei de cometer um erro ao colá-lo aqui, mas o nome de usuário e o nome do banco de dados são os mesmos, por minha culpa.
JoinOG em
Tente adicionar ASseus aliases.
ThinkingStiff
4
@GauravRamanan the s. * Diz ao mysql o que DELETE, você não quer deletar linhas da tabela
JOINED
12

Se o banco de dados for InnoDB, então pode ser uma idéia melhor usar chaves estrangeiras e cascatear na exclusão, isso faria o que você deseja e também resultaria em nenhum dado redundante sendo armazenado.

Para este exemplo, entretanto, não acho que você precise dos primeiros s:

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

Pode ser uma ideia melhor selecionar as linhas antes de excluir, para ter certeza de que deseja excluir:

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

Você também pode verificar a sintaxe de exclusão do MySQL aqui: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Dan
fonte
Este é o erro que recebo: [Err] 1064 - Você tem um erro na sintaxe SQL; verifique o manual que corresponde à sua versão do servidor MySQL para a sintaxe correta para usar INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste 'na linha 1 [Err] DELETE FROM spawnlist s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monstro"; [Msg] Concluído - Sem sucesso ------------------------ --------------------------
JoinOG
Alterado, pode ter mais sucesso agora?
Dan
Erro: [Err] 1066 - Tabela / alias não exclusivo: 'npc' [Err] DELETE lista de spawnlist FROM, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = ""; [Msg] Concluído - Sem sucesso -------------------------------------------- ------
JoinOG
Se você for executá-lo apenas uma vez, poderá executar o horrivelmente ineficiente: DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate de npc WHERE type = "monstro");
Corbin
Essa é minha última tentativa, se você está excluindo de apenas uma tabela em uma junção, então não consigo ver por que isso não funciona.
Dan
6

se o banco de dados for InnoDB, você não precisa fazer junções na exclusão. só

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

pode ser usado para excluir todos os registros vinculados a chaves estrangeiras em outras tabelas, para fazer isso você deve primeiro vincular suas tabelas em tempo de design.

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;

se você usa MyISAM você pode deletar registros entrando assim

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

na primeira linha eu inicializei as duas tabelas temporárias para deletar o registro, na segunda linha eu atribuí a tabela de existência a ambos a e b, mas aqui eu vinculei as duas tabelas com a palavra-chave de junção e combinei a chave primária e estrangeira para ambas as tabelas que fazem link, na última linha filtrou o registro por campo para deletar.

Aylian Craspa
fonte
typeestá na outra tabela, não na spawnlisttabela, portanto, a junção é necessária
vitro,