INNER JOINを使用したSQL DELETE


120

テーブルは2つspawnlistありnpc、とからデータを削除する必要がありますspawnlsitnpc_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の質問について助けを求めています。
MarcoAurélioDeleu 2016年

t1.id = t2.idのtable1からtable1 t1内部結合table2 t2から削除します。詳細youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

回答:


224

最初の行に追加.*sます。

試してください:

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

これが私が得たエラーです:[Err] 1064-SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' at line 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"); [メッセージ]完了-失敗-------------------------------------------- ------
JoinOG 2011

エラーでは、に2つの異なるサーバー名を使用しているようですspawnlist。私が見るl2revo.root.spawnlistdb.root.spawnlist
ThinkingStiff

ここに貼り付けて間違えただけですが、ユーザー名とデータベース名は同じです。
JoinOG 2011

ASエイリアスを追加してみてください。
ThinkingStiff

4
。* MySQLを伝えS @GauravRamananあなたが結合されたテーブルから行を削除したくない、何を削除するには
Julz

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/en/delete.htmlでも確認できます。


これは私が取得するエラーです:[Err] 1064-SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、nearのINNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste 'at line 1 [Err] DELETE FROM spawnlist s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg]終了-失敗------------------------ --------------------------
JoinOG '12 / 12/22

変更されましたが、今より成功する可能性がありますか?
ダン

エラー:[Err] 1066-一意でないテーブル/エイリアス: 'npc' [Err] DELETE spawnlist FROM spawnlist、npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [メッセージ]終了-失敗-------------------------------------------- ------
JoinOG 2011

一度だけ実行する場合は、恐ろしく非効率的な次のように実行できます。DELETEFROM spawnlist WHERE npc_templateid IN(SELECT idTemplate from npc WHERE type = "monster");
コービン、

それが私の最後の試みです。結合の1つのテーブルから削除すると、それが機能しない理由がわかりません。
Dan

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';

最初の行でレコードを削除するために2つの一時テーブルを初期化し、2番目の行で存在テーブルをaとbの両方に割り当てましたが、ここでは結合キーワードで両方のテーブルをリンクし、主キーと外部キーを一致させましたリンクを作成する両方のテーブルについて、最後の行で、レコードをフィールドでフィルタリングして削除しました。


typeは実際には表ではなく他のspawnlist表にあるため、結合が必要です
インビトロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.