SQL DELETE mit INNER JOIN

120

Es gibt 2 Tabellen spawnlistund npc, und ich muss Daten aus löschen spawnlsit. npc_templateid = n.idTemplateist das einzige, was die Tabellen "verbindet". Ich habe dieses Skript ausprobiert, aber es funktioniert nicht.

Ich habe das versucht:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
JoinOG
quelle
1
War mehr überrascht, weil die L2-Community normalerweise für sich bleibt. War ein bisschen seltsam, obwohl ich die Frage gelesen und gedacht habe "das sieht aus wie ... hmm ... es ist!" :)
Corbin
1
@Corbin Ich verstehe total was du meinst. Interessanterweise bekomme ich Hilfe bei einer L2-Frage zu einem Arbeitsprojekt.
Marco Aurélio Deleu
Löschen aus Tabelle1 aus Tabelle1 t1 innere Verknüpfungstabelle2 t2 auf t1.id = t2.id; im Detail youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Antworten:

224

In .*zu sIhrer ersten Zeile.

Versuchen:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
ThinkingStiff
quelle
Hier ist der Fehler, den ich bekommen habe: [Err] 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' in Zeile 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 = "monster"); [Nachricht] Fertig - erfolglos ---------------------------------------- ------
JoinOG
In Ihrem Fehler sieht es so aus, als würden Sie zwei verschiedene Servernamen für verwenden spawnlist. Ich sehe l2revo.root.spawnlistund db.root.spawnlist.
ThinkingStiff
Ich habe nur einen Fehler gemacht, als ich es hier eingefügt habe, aber der Benutzername und der Datenbankname sind bei meinem Fehler gleich.
JoinOG
Versuchen Sie, ASfür Ihre Aliase hinzuzufügen .
ThinkingStiff
4
@GauravRamanan the s. * Sagt MySQL, was zu löschen ist, Sie möchten keine Zeilen aus der JOINED-Tabelle löschen
Julz
12

Wenn es sich bei der Datenbank um InnoDB handelt, ist es möglicherweise besser, Fremdschlüssel und Kaskaden beim Löschen zu verwenden. Dies würde das tun, was Sie möchten, und auch dazu führen, dass keine redundanten Daten gespeichert werden.

Für dieses Beispiel brauche ich jedoch nicht die ersten s:

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

Es ist möglicherweise besser, die Zeilen vor dem Löschen auszuwählen, damit Sie sicher sind, dass Sie das löschen, was Sie möchten:

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

Sie können die MySQL-Löschsyntax auch hier überprüfen: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Dan
quelle
Dies ist der Fehler, den ich bekomme: [Err] 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste" in Zeile 1 [Err] DELETE FROM spawnlist s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Fertig - erfolglos ------------------------ --------------------------
JoinOG
Geändert, könnte jetzt erfolgreicher sein?
Dan
Fehler: [Err] 1066 - Nicht eindeutige Tabelle / Alias: 'npc' [Err] Spawnliste AUS Spawnliste löschen, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Msg] Fertig - erfolglos ---------------------------------------- ------
JoinOG
Wenn Sie es nur einmal ausführen, können Sie das schrecklich ineffiziente ausführen: DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin
Das ist mein letzter Versuch. Wenn Sie nur eine Tabelle in einem Join löschen, kann ich nicht erkennen, warum dies nicht funktioniert.
Dan
6

Wenn die Datenbank InnoDB ist, müssen Sie beim Löschen keine Verknüpfungen durchführen. nur

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

kann verwendet werden, um alle Datensätze zu löschen, die mit Fremdschlüsseln in anderen Tabellen verknüpft sind. Dazu müssen Sie Ihre Tabellen zuerst in der Entwurfszeit verknüpfen.

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;

Wenn Sie MyISAM verwenden, können Sie Datensätze löschen, die sich wie folgt verbinden

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

In der ersten Zeile habe ich die beiden temporären Tabellen zum Löschen des Datensatzes initialisiert. In der zweiten Zeile habe ich die Existenztabelle sowohl a als auch b zugewiesen, aber hier habe ich beide Tabellen mit dem Join-Schlüsselwort verknüpft und den Primär- und den Fremdschlüssel abgeglichen Für beide Tabellen, die eine Verknüpfung herstellen, habe ich in der letzten Zeile den Datensatz nach dem zu löschenden Feld gefiltert.

Aylian Craspa
quelle
typebefindet sich tatsächlich in der anderen Tabelle, nicht in der spawnlistTabelle, daher ist ein Beitritt erforderlich
vitro