SQL DELETE INNER JOIN


120

Є 2 таблиці, spawnlistі npc, і мені потрібно видалити дані spawnlsit. npc_templateid = n.idTemplateце єдине, що "з'єднує" таблиці. Я спробував цей сценарій, але він не працює.

Я спробував це:

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

1
Був більше здивований, оскільки зазвичай спільнота L2 тримає себе. Був трохи дивним, хоча читав питання і думав, "схоже на ... хм ... це!" :)
Корбін

1
@Corbin Я повністю бачу, що ти маєш на увазі. Досить цікаво, я отримую допомогу з питання L2 до робочого проекту.
Marco Aurélio Deleu

Видалити з table1 з table1 t1 внутрішнє з'єднання table2 t2 на t1.id = t2.id; докладно youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Відповіді:


225

Додати .*вs свого першого рядка.

Спробуйте:

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

Ось помилка, яку я отримав: [Помилка] 1064 - у вашому синтаксисі SQL помилка; перевірте посібник, який відповідає вашій версії сервера MySQL, чи правильний синтаксис використовувати поруч із 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' у рядку 1 [Err] DELETE l2revo.root. spawnlist ВІД db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "монстр"); [Повідомлення] Готово - Невдало -------------------------------------------- ------
JoinOG

З вашої помилки, схоже, ви використовуєте два різних імена сервера для spawnlist. Я бачу l2revo.root.spawnlistі db.root.spawnlist.
ThinkingStiff

я просто помиляюся, вставляючи його тут, але ім'я користувача та ім'я db однакові, на мою помилку.
JoinOG

Спробуйте додати ASпсевдоніми.
ДумаючиСтиф

4
@GauravRamanan the s. * Каже mysql, що ВИДАЛИТИ, ви не хочете видаляти рядки з таблиці
ПРИЄДНАННЯ

12

Якщо база даних - InnoDB, то, можливо, буде кращою ідеєю використовувати сторонні ключі та каскад при видаленні, це зробить все, що вам потрібно, а також не призведе до збереження зайвих даних.

Однак для цього прикладу я не думаю, що вам потрібні перші s:

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

Можливо, буде кращою ідеєю вибрати рядки перед видаленням, щоб ви впевнені, що видаляєте те, що хочете:

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

Ви також можете перевірити синтаксис видалення MySQL тут: http://dev.mysql.com/doc/refman/5.0/uk/delete.html


Це помилка, яку я отримую: [Помилка] 1064 - у вашому синтаксисі SQL помилка; перевірте посібник, який відповідає вашій версії сервера MySQL, чи правильно використовувати синтаксис для використання поблизу 'INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste" у рядку 1 [Помилка] ВИДАЛИТИ ІЗ ІННЕРУ spawnlist ПРИЄДНАЙТЕ npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Закінчено - Невдало ------------------------ --------------------------
JoinOG

Змінено, може бути успішнішим зараз?
День

Помилка: [Err] 1066 - Не унікальна таблиця / псевдонім: 'npc' [Помилка] ВИДАЛИТИ spawnlist ІЗ spawnlist, npc ВНУТРІШНЯ ПРИЄДНАЙТЕСЬ npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Повідомлення] Готово - Невдало -------------------------------------------- ------
JoinOG

Якщо ви просто збираєтеся запустити його один раз, ви можете запустити жахливо неефективний: ВИДАЛИТИ З нересту списку, де npc_templateid IN (ВИБІРТЕ idTemplate від npc WHERE type = "monster");
Корбін

Це моя остання спроба, якщо ви видалите лише одну таблицю під час з'єднання, я не можу зрозуміти, чому це не вийде.
День

6

якщо база даних InnoDB, вам не потрібно приєднуватися до видалення. тільки

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

можна використовувати для видалення всіх записів, які пов’язані із зовнішніми ключами в інших таблицях, для цього вам потрібно спочатку зв’язати свої таблиці під час проектування.

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;

якщо ви використовуєте MyISAM, ви можете видалити записи, приєднавшись до цього

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

у першому рядку я ініціалізував дві таблиці temp для видалення запису, у другому рядку я призначив таблицю існування і a, і b, але тут я зв'язав обидві таблиці разом із ключовим словом приєднання, і я зіставлю первинний та зовнішній ключ для обох таблиць, які створюють посилання, я в останньому рядку відфільтрував запис за полем для видалення.


typeнасправді в іншій таблиці, а не в spawnlistтаблиці, тому приєднуватися потрібно
vitro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.