SQL Server에서 INNER JOIN을 사용하여 삭제하는 방법?


1283

SQL Server 2008INNER JOIN 에서 를 사용하여 삭제하고 싶습니다 .

하지만이 오류가 발생합니다.

메시지 156, 수준 15, 상태 1, 줄 15
키워드 'INNER'근처의 구문이 잘못되었습니다.

내 코드 :

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

2
문서의 예제 C DELETE는 조인과 함께 사용하는 방법을 보여줍니다.
Pondlife

1
예제 C는 커서와 관련없는
것들도 사용합니다.

t1.id = t2.id의 table1 t1 내부 조인 table2 t2에서 table1에서 삭제; 자세한 내용 youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

답변:


2241

삭제할 테이블을 지정해야합니다. 다음은 별칭이있는 버전입니다.

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

9
@bluefeet 두 테이블에서 삭제하기 위해 SQL Server에 올바른 구문을 제공 할 수 있습니까?
oabarca

44
@ user2070775 SQL Server에서 2 개의 테이블을 삭제하려면 2 개의 별도 명령문을 사용해야합니다.
Taryn

8
SQL Server의 @ user2070775에서 stackoverflow.com/questions/783726/…에
Mathieu Rodic

1
@MathieuRodic 공유해 주셔서 감사합니다. 내 설정에서 두 테이블에서 별도로 삭제하면 더 이상 두 번째 테이블에서 삭제할 행을 더 이상 알지 못하므로 도움이 될 것입니다.)
Verena Haunschmid

2
WorkRecord2 테이블의 별명 인 @ShahryarSaljoughi.
Taryn

151

삭제할 테이블을 지정해야하므로 레코드를 삭제하려는 위치 DELETE와 그 사이에 테이블 이름을 추가하십시오 FROM. 또한 제거ORDER BY 레코드를 삭제하는 동안 주문할 항목이 없으므로 절을 .

따라서 최종 쿼리는 다음과 같아야합니다.

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';

3
첫 번째 테이블에서만 삭제하려는 경우 SQL Server에서 작동합니다.
TroySteven

1
@matwonk : 두 번째 테이블의 이름을 사용하는 경우 두 번째 테이블에서 삭제할 수 있습니다. 예를 들어를 사용 DELETE Employee하면 테이블 대신 직원 테이블에서 삭제됩니다 WorkRecord2.
hims056

1
@matwonk : 예는 다음과 같습니다. 1) 첫 번째 테이블 에서 삭제 2) 두 번째 테이블에서 삭제 .
hims056

30

가능하면 도움이 될 것입니다.

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

아니면 이것을 시도하십시오-

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)

1
이것은 Sql Server에서 작동하는 유일한 대답입니다. 그냥 ID를 선택처럼 쿼리를 작성에서 ... 참여 ... 다음 등 조인 하위 쿼리로 포장하고 (표) 여기서 이드 (하위 쿼리)에서 삭제를 할
크리스 Moschini


16

그것은해야한다:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       

11

이 버전은 작동합니다

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'

11

SQL Server Management Studio에서 SELECT쿼리를 쉽게 만들 수 있습니다 .

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

실행할 수 있고 모든 연락처가 표시됩니다.

이제 변경 SELECTA를 DELETE:

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

당신이 본 모든 기록 SELECT명세서 삭제됩니다.

동일한 절차를 사용하여 더 어려운 내부 조인을 만들 수도 있습니다 (예 :

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf

10
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'

9

이 쿼리를 사용해보십시오 :

DELETE WorkRecord2, Employee 
FROM WorkRecord2 
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1' 
AND tbl_name.Date = '2013-05-06';

8
DELETE가 하나의 테이블 만 지정할 수 있다고 확신합니다. 이것은 나를 위해 작동하지 않습니다.
Stealth Rabbi

3
mySQL에서 삭제하기 위해 여러 테이블을 지정할 수 있지만 SQL Server (질문이 아닌)는 지정할 수 없다고 생각합니다.
dandev91

7

를 사용하는 다른 방법 CTE.

;WITH cte 
     AS (SELECT * 
         FROM   workrecord2 w 
         WHERE  EXISTS (SELECT 1 
                        FROM   employee e 
                        WHERE  employeerun = employeeno 
                               AND company = '1' 
                               AND date = '2013-05-06')) 
DELETE FROM cte 

참고 : 원하는 경우 JOIN내부를 사용할 수 없습니다 .CTEdelete


6

한 번에 두 테이블에서 레코드를 삭제하는 간단한 쿼리입니다.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'

2
이 질문은 SQL Server에 대한 것입니다. SQL Server의 한 명령문에서 두 테이블을 삭제할 수 없습니다. 내 이해는 이것이 mysql 및 MS Access에서 수행 할 수 있다는 것입니다.
대런 그리피스

6

이것을 시도하십시오, 그것은 도움이 될 수 있습니다

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';

7
허용되는 답변과 어떻게 다른 가요? stackoverflow.com/questions/16481379/… ?
기본 로케일

3
이 답변은 앨리어싱이 아닌 명시적인 테이블 이름을 사용하므로 경험이 적은 사람들이 진행 상황을 읽고 / 잡을 수 있습니다.
Joshua Burns

1
@JoshuaBurns : 여전히 정확한 복제본 내 대답 .
hims056

4

여기 내 SQL Server 버전이 있습니다.

DECLARE @ProfileId table(Id bigint)

DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email

DELETE FROM UserProfiles    
WHERE Id = (Select Id FROM @ProfileId)

4

Company및에 대한 표를 지정하지 않았습니다Date 이를 수정하려고 할 수 있습니다.

다음을 사용하는 표준 SQL MERGE:

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

@Devart의 답변은 표준 SQL이지만 불완전하지만 다음과 같이 보입니다.

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

위에서 주목해야 할 중요한 점은 삭제가 스칼라 하위 쿼리를 요구하여 두 번째 예에서 시행 된 것처럼 단일 테이블을 대상으로한다는 것이 분명하다는 것입니다.

나에게 다양한 독점적 인 구문 답변을 읽고 이해하기가 더 어렵습니다. 나는 생각에 @frans eilering의 답변에 가장 잘 설명되어 있다고 생각합니다. 즉 코드를 작성하는 사람이 코드를 읽고 관리하는 사람을 신경 쓰지 않아도됩니다.


4

삭제 또는 업데이트에 현재 사용하는 내용은 다음과 같습니다.

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.