SQL DELETE con INNER JOIN


120

Ci sono 2 tabelle spawnliste npc, e ho bisogno di eliminare i dati da spawnlsit. npc_templateid = n.idTemplateè l'unica cosa che "connette" i tavoli. Ho provato questo script ma non funziona.

Ho provato questo:

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

1
Sono rimasto più sorpreso perché in genere la comunità L2 si tiene in se stessa. È stato un po 'strano leggere la domanda e pensare "sembra che ... hmm ... lo è!" :)
Corbin

1
@ Corbin Capisco perfettamente cosa intendi. Abbastanza interessante, sto ricevendo aiuto su una domanda L2 per un progetto di lavoro.
Marco Aurélio Deleu

Elimina da table1 da table1 t1 inner join table2 t2 su t1.id = t2.id; in dettaglio youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Risposte:


224

Aggiungi .*a snella prima riga.

Provare:

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

Ecco l'errore che ho ricevuto: [Err] 1064 - Hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' alla riga 1 [Err] DELETE l2revo.root. spawnlist DA db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] Finished - Senza successo -------------------------------------------- ------
JoinOG

Nel tuo errore sembra che tu stia usando due diversi nomi di server per spawnlist. Vedo l2revo.root.spawnliste db.root.spawnlist.
ThinkingStiff

Faccio solo un errore incollandolo qui, ma il nome utente e il nome del database sono gli stessi, a mio errore.
JoinOG

Prova ad aggiungere ASper i tuoi alias.
ThinkingStiff

4
@GauravRamanan the s. * Dice a mysql cosa CANCELLARE, non vuoi cancellare le righe dalla tabella
JOINED

12

Se il database è InnoDB, potrebbe essere un'idea migliore usare chiavi esterne e cascata all'eliminazione, questo farebbe quello che vuoi e non risulterebbe inoltre nell'archiviazione di dati ridondanti.

Per questo esempio, tuttavia, non penso che tu abbia bisogno dei primi:

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

Potrebbe essere un'idea migliore selezionare le righe prima di eliminarle in modo da essere sicuro di eliminare ciò che desideri:

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

Puoi anche controllare la sintassi di eliminazione di MySQL qui: http://dev.mysql.com/doc/refman/5.0/en/delete.html


Questo è l'errore che ricevo: [Err] 1064 - Hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste 'alla riga 1 [Err] DELETE FROM spawnlist s INNER UNISCITI a npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Finito - Senza successo ------------------------ --------------------------
JoinOG

Cambiato, potrebbe avere più successo ora?
Dan

Errore: [Err] 1066 - Tabella / alias non univoco: 'npc' [Err] DELETE spawnlist FROM spawnlist, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Msg] Finito - Senza successo -------------------------------------------- ------
JoinOG

Se hai intenzione di eseguirlo una sola volta, potresti eseguire il terribilmente inefficiente: DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin

Questo è il mio ultimo tentativo, se elimini da un solo tavolo in un join, non riesco a capire perché non funzionerà.
Dan

6

se il database è InnoDB non è necessario eseguire join durante la cancellazione. solo

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

può essere utilizzato per eliminare tutti i record collegati con chiavi esterne in altre tabelle, per farlo devi prima collegare le tabelle in fase di progettazione.

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 usi MyISAM puoi cancellare i record che si uniscono in questo modo

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

in prima riga ho inizializzato le due tabelle temporanee per cancellare il record, in seconda riga ho assegnato la tabella di esistenza sia a a che a b ma qui ho collegato entrambe le tabelle insieme alla parola chiave join e ho abbinato la chiave primaria e quella esterna per entrambe le tabelle che fanno collegamento, nell'ultima riga ho filtrato il record per campo da eliminare.


typein realtà è nell'altra tabella, non nella spawnlisttabella, quindi è necessario unirsi
vitro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.