INNER JOIN을 사용한 SQL DELETE


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 on t1.id = t2.id; 세부 사항 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'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

귀하의 오류로 인해 .NET에 두 개의 다른 서버 이름을 사용하고있는 것 같습니다 spawnlist. 내가보고 l2revo.root.spawnlistdb.root.spawnlist.
ThinkingStiff

여기에 붙여 넣는 실수를 범했지만 사용자 이름과 db 이름은 동일합니다.
JoinOG

AS별칭을 추가해보십시오 .
ThinkingStiff

4
@GauravRamanan the s. *는 mysql에게 무엇을 삭제할 것인지 알려줍니다. JOINED 테이블에서 행을 삭제하고 싶지 않습니다
Julz

12

데이터베이스가 InnoDB 인 경우 외래 키를 사용하고 삭제시 캐스케이드하는 것이 더 좋을 수 있습니다. 이렇게하면 원하는 작업을 수행 할 수 있으며 중복 데이터가 저장되지 않습니다.

이 예에서는 첫 번째가 필요하지 않다고 생각합니다.

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

http://dev.mysql.com/doc/refman/5.0/en/delete.html 에서 MySQL 삭제 구문을 확인할 수도 있습니다.


이것은 내가 얻는 오류입니다. [Err] 1064-SQL 구문에 오류가 있습니다. 's INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste'at line 1 [Err] DELETE FROM spawnlist s INNER 근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 가입 npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Finished-Unsuccessfully ------------------------ --------------------------
JoinOG

변경되었습니다. 이제 더 성공적일까요?
Dan

오류 : [Err] 1066-고유 한 테이블 / 별칭이 아님 : 'npc'[Err] 생성 목록에서 생성 목록 삭제, npc 내부 참여 npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Msg] 완료 됨-실패 -------------------------------------------- ------
JoinOG

한 번만 실행하려는 경우 매우 비효율적으로 실행할 수 있습니다. DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin

이것이 내 마지막 시도입니다. 조인의 한 테이블에서만 삭제하면 왜 작동하지 않는지 알 수 없습니다.
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';

첫 번째 줄에서는 레코드를 삭제하기 위해 두 개의 임시 테이블을 초기화했으며 두 번째 줄에서는 존재 테이블을 a와 b 모두에 할당했지만 여기서는 조인 키워드로 두 테이블을 함께 연결했으며 기본 및 외래 키를 일치 시켰습니다. 링크를 만드는 두 테이블에 대해 마지막 줄에서 삭제할 필드로 레코드를 필터링했습니다.


type실제로는 테이블이 아니라 다른 테이블 spawnlist에 있으므로 조인이 필요합니다
시험관
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.