Open-Closed Principle

[MS-SQL] DELETE JOIN 본문

Programming/MS-SQL

[MS-SQL] DELETE JOIN

대박플머 2016. 2. 4. 00:00

T-SQL에서는 조인을 사용하는 비표준 방식의 DELETE 구문을 제공한다. 

조인은 술어(ON 절에 있는)를 기반으로 필터하기 때문에, 조인 자체만으로도 필터링하는 기능을 제공하고 있따. 또한, 조인을 이용하면 참조하는 다른 테이블의 관련된 행의 특성들을 WHERE 절에서 사용할 수 있도록 해준다. 이는 다른 테이블에 있는 연관된 행의 특성들을 이용해서 현재 테이블의 행들을 필터링한 다음, 필터링된 핸들을 삭제할 수 있다는 것을 말한다. 

아래 쿼리는 DELETE 쿼리의 JOIN을 사용한 예이다. 

1
2
3
4
Delete From O
From dbo.Orders AS O
Inner Join dbo.Customers As C On O.custid = C.custid
Where C.country = N'USA';
cs

조인을 이용하는 DELETE 구문에서 두 개의 FROM 절이 있는 것이 좀 이상할  수도 있따. 그러나 코드를 개발할 때에는 조인을 사용하는 SELECT  문을 만드는 것처럼 작업을 하면된다. 즉 조인하는 FROM 절로 시작해서 WHERE 절을 만들고, 마지막으로 SELECT 절을 지정하는 대신 DELETE 절과 조인에서 삭제하고자 하는 쪽에 있는 테이블의 별칭을 지정하면 된다. 

위에서 설명한 내용은 DELETE 구문의 표준 방식이 아니다. 만약, 표준 방식의 코드로 처리하고자 한다면 조인 대신 하위 쿼리를 사용하면 된다. 위의 예제를 하위쿼리를 이용해서 작성해보도록 하자.

1
2
3
4
5
6
7
8
Delete From O
From dbo.Orders AS O
Where Exists(
    Select * 
    From dbo.Customers AS C
    Where O.CustId = C.CustId
    And C.Country = N'USA'
);
cs

두 쿼리가 동일한 일을 하니 이제 성능이 궁굼할 것이다. 

SOL Server는 두 쿼리를 모두 거의 동일한 방석으로 처리한다. 따라서 두 가지 방법 간에 성능 차이를 기대해서는 안 된다.

'Programming > MS-SQL' 카테고리의 다른 글

[MS-SQL] UNION 연산자  (0) 2016.02.16
[MS-SQL]공통 테이블 식(CTE)  (0) 2016.02.12
[MS-SQL]데이터 삭제 DELETE vs TRUNCATE  (0) 2016.02.03
[MS-SQL]SELECT INTO 구문  (0) 2016.02.03
[MS-SQL]Identity 속성  (0) 2016.02.02