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.spawnlist와 db.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.