DB

[MS-SQL] DELETE문에 INNER JOIN문 사용하여 삭제하는 활용법

MSSQL 데이터베이스의 DELETE문 사용방법에 대해 알아봅니다. delete문의 경우 데이터베이스에서 데이터를 삭제할 때 사용하는 구문입니다. 그럼으로 주의해야합니다. 테스트DB라면 상관없지만 상용DB라면 큰일이 발생하게 됩니다. 그럼으로 항상 주의해야합니다. 백업DB로 복구하는것도 한계가 있기 때문이에요. delete문을 실행하기 전에 꼭 확인 꼭 확인입니다. 오라클 DBA로 잠깐 일 시작했을 때 100명의 개발자를 2시간 동안 놀게 만든적이 있기 때문에 당부를 드리는거에요. 지금은 웃지만 그 때는 패닉이었어요.

 

100명의 개발자가 2시간 놀면 그날 허공의로 날린 회사 비용은???

DELETE문과 UPDATE문 사용시 반드시 트랙잰션 구문을 사용해서 처리합니다.

그래야 롤백도 할 수 있고 커밋도 할 수 있어요. DELTE문의 실행결과를 데이터베이스에 적용하는 것을(Commit)이라고  합니다. 그리고 반대로 DELETE문 실행 이전으로 되돌리는것을 롤백(RollBack)이라고 합니다.

MSSQL의 DELETE 구문(Syntax)

-- Syntax for SQL Server and Azure SQL Database  
  
[ WITH <common_table_expression> [ ,...n ] ]  
DELETE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ FROM ]   
    { { table_alias  
      | <object>   
      | rowset_function_limited   
      [ WITH ( table_hint_limited [ ...n ] ) ] }   
      | @table_variable  
    }  
    [ <OUTPUT Clause> ]  
    [ FROM table_source [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                   { { [ GLOBAL ] cursor_name }   
                       | cursor_variable_name   
                   }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <Query Hint> [ ,...n ] ) ]   
[; ]  
  
<object> ::=  
{   
    [ server_name.database_name.schema_name.   
      | database_name. [ schema_name ] .   
      | schema_name.  
    ]  
    table_or_view_name   
}
-- Syntax for Azure Synapse Analytics

[ WITH <common_table_expression> [ ,...n ] ] 
DELETE [database_name . [ schema ] . | schema. ] table_name  
FROM [database_name . [ schema ] . | schema. ] table_name 
JOIN {<join_table_source>}[ ,...n ]  
ON <join_condition>
[ WHERE <search_condition> ]   
[ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

<join_table_source> ::=   
{  
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias 
    [ <tablesample_clause>]  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
}
-- Syntax for Parallel Data Warehouse  
  
DELETE 
    [ FROM [database_name . [ schema ] . | schema. ] table_name ]   
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]
DELETE FROM 테이블명
DELETE FROM 테이블명 WHERE 조건문

바로 예제로 알아봅니다.

아래 예제는 가장 기본적인 삭제 방법입니다.

BEGIN TRAN문을 반드시 써주고

DELETE문을 실행하고

결과 확인을 휘애 SELECT문을 작성하고

그리고

제일 중요한 수간입니다.

ROLLBACK TRAN(롤백을 할 것인가?)

COMMIT TRAN(커밋을 할것인가?)

작업이 잘못 되었다면 롤백하면 되돌릴 수 있습니다.

항상 세트로 따라다닌다고 생각하고 작성하세요. 

BEGIN TRAN
  DELETE FROM TB_EMPLOY WHERE EMPLOY_ID ='e001'

  SELECT * FROM TB_EMPLOY WHERE EMPLOY_ID ='e001'

ROLLBACK TRAN

COMMIT TRAN

 

내가 작성한 쿼리의 결과를 토대로 삭제를 해야할 경우가 있습니다.

이럴경우 CURSOR를 사용해서 처리할 수 도 있지만  간단하게 DELETE문으로 처리하는 방법이 있습니다.

바로 다음과 같이 조회 결과를 INNER JOIN문을 사용하여 삭제하는 방법의 쿼리입니다. 

DELETE S
FROM TB_CUSTOMER S
INNER JOIN (
	SELECT X.*
	FROM 
	(
		 SELECT MAX(A.ACT_DATE) AS ACT_DATE, MAX(A.ACTION_ID) AS ACTION_ID,  A.COMPANY_ID ,  A.DOMAIN, A.EMPLOY_ID
		 FROM TB_ACTION A WITH (NOLOCK)
		 INNER JOIN TB_CUSTOMER C WITH (NOLOCK) ON C.DOMAIN = A.DOMAIN AND C.EMPLOY_ID = A.EMPLOY_ID
		  ...........생략
		 WHERE CP.ITEM_TYPE_CD = 'NEW'
		 AND CP.IS_USING_YN = 'Y'
		 AND M.DATA_TYPE ='CODE'
		 AND M.EXT_ATTR_KEY LIKE '%_001'
		 GROUP BY A.EMPLOY_ID, A.DOMAIN, A.COMPANY_ID
	) X
	WHERE CONVERT( VARCHAR(10), GETDATE(),120) = DATEADD(YEAR, 2, CONVERT(DATE,X.ACT_DATE))
) Y ON Y.DOMAIN = S.DOMAIN AND Y.EMPLOY_ID = S.EMPLOY_ID

 오늘은 여기까지!! 즐거운 주말 보내세요!!

[REFERENCE]

 

Leave a Reply

error: Content is protected !!