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.