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");

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");

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


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.


typeestá na outra tabela, não na spawnlisttabela, portanto, a junção é necessária
— vitro,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.