SQL DELETE z INNER JOIN

120

Istnieją 2 stoły, spawnlisti npc, i muszę usunąć dane z spawnlsit. npc_templateid = n.idTemplatejest jedyną rzeczą, która „łączy” tabele. Próbowałem tego skryptu, ale nie działa.

Próbowałem tego:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
JoinOG
źródło
1
Byłem bardziej zaskoczony, ponieważ zazwyczaj społeczność L2 trzyma się siebie. To było trochę dziwne, chociaż przeczytanie pytania i myślenie „to wygląda… hmm… jest!” :)
Corbin
1
@Corbin Całkowicie rozumiem, co masz na myśli. Co ciekawe, otrzymuję pomoc dotyczącą pytania L2 do projektu pracy.
Marco Aurélio Deleu
Usuń z tabeli1 z tabeli1 t1 złączenie wewnętrzne tabela2 t2 na t1.id = t2.id; szczegółowo youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Odpowiedzi:

225

Dodaj .*do sw pierwszej linii.

Próbować:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
Myślenie Sztywne
źródło
Oto błąd, który otrzymałem: [Err] 1064 - Wystąpił błąd w składni SQL; sprawdź w podręczniku, który odpowiada Twojej wersji serwera MySQL, prawidłową składnię do użycia w pobliżu 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' w linii 1 [Err] DELETE l2revo.root. spawnlist Z db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] Zakończone - niepowodzenie -------------------------------------------- ------
JoinOG
W twoim błędzie wygląda na to, że używasz dwóch różnych nazw serwerów dla spawnlist. Rozumiem l2revo.root.spawnlisti db.root.spawnlist.
ThinkingStiff
po prostu popełniam błąd, wklejając go tutaj, ale nazwa użytkownika i nazwa bazy danych są takie same, na mój błąd.
JoinOG
Spróbuj dodać ASswoje aliasy.
ThinkingStiff
4
@GauravRamanan the s. * Mówi mysql, co należy DELETE, nie chcesz usuwać wierszy z tabeli
JOINED
12

Jeśli baza danych to InnoDB, lepszym pomysłem może być użycie kluczy obcych i kaskadowe usuwanie, co zrobi to, co chcesz, a także spowoduje, że nie będą przechowywane zbędne dane.

Jednak w tym przykładzie nie wydaje mi się, żebyś potrzebował pierwszych liter:

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

Lepszym pomysłem może być zaznaczenie wierszy przed usunięciem, aby mieć pewność, że usuwasz to, co chcesz:

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

Możesz również sprawdzić składnię usuwania MySQL tutaj: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Dan
źródło
Oto błąd, który otrzymuję: [Err] 1064 - Masz błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby znaleźć właściwą składnię do użycia near 's INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste' w linii 1 [Err] USUŃ Z INNER listy spawnów s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Zakończone - Nieudane ------------------------ --------------------------
JoinOG
Zmieniony, czy teraz może być bardziej skuteczny?
Dan,
Błąd: [Błąd] 1066 - Nie unikalna tabela / alias: 'npc' [Błąd] USUŃ listę spawnów Z listy spawn, npc INNER DOŁĄCZ npc GDZIE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Msg] Zakończone - niepowodzenie -------------------------------------------- ------
JoinOG
Jeśli zamierzasz go uruchomić tylko raz, możesz uruchomić strasznie nieefektywny: DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin
To moja ostatnia próba, jeśli usuniesz tylko z jednego stołu przy złączeniu, nie rozumiem, dlaczego to nie zadziała.
Dan,
6

jeśli baza danych to InnoDB, nie musisz wykonywać łączenia podczas usuwania. tylko

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

można użyć do usunięcia wszystkich rekordów połączonych z kluczami obcymi w innych tabelach, aby to zrobić, musisz najpierw połączyć swoje tabele w czasie projektowania.

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;

jeśli korzystasz z MyISAM, możesz usunąć rekordy, do których się dołączasz

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

w pierwszym wierszu zainicjowałem dwie tabele tymczasowe do usunięcia rekordu, w drugim wierszu przypisałem tabelę istnienia zarówno do a i b, ale tutaj połączyłem obie tabele razem ze słowem kluczowym join i dopasowałem klucz podstawowy i obcy dla obu tabel, które tworzą link, w ostatniej linii przefiltrowałem rekord według pola do usunięcia.

Aylian Craspa
źródło
typejest właściwie w innej tabeli, a nie w spawnlisttabeli, więc połączenie jest konieczne
vitro