2012-10-22 3 views
3

데이터베이스 테이블에서 이전 데이터를 정리해야합니다. 다음은 두 테이블을 보여줍니다. app_statusapp_personal_details.SQL Select then Delete

enter image description here

나는 모든 오늘부터 12 개월 동안 생성 된 app_status 테이블에서 레코드 (응용 프로그램) 그때 삭제할

select status_id 
from dbo.app_status 
where submission_date <= dateadd(month, -12, getdate()) order by 1 

날짜를 선택하려면 다음 쿼리를 app_personal_details 테이블의 모든 레코드 위의 검색된 status_id 목록에 application_id가 있습니다.

나는 이것이 의미가 있기를 바랍니다. 두 테이블에서 데이터를 삭제하는 빠른 방법을 알고 싶습니다.

도움 주셔서 감사합니다.

답변

3
delete from app_personal_details 
where application_id in (
    select status_id 
    from dbo.app_status 
    where submission_date <= dateadd(month, -12, getdate()) 
) 
+0

우수. 고맙습니다. – tgriffiths

+0

런타임에 데이터베이스가 빠르게 변경되는 경우 일부 데이터를 선택하고 java에서 arraylist에 저장하지만 DB에서 동일한 항목을 삭제 한 직후 어떻게해야합니까? –

+0

제 말은 ID를 기반으로 2 개의 쿼리를 수행하고 삭제해야합니까? Ir는 선택 + 삭제 방법이 있습니까? –

2

subselect를 사용할 수 있습니다.

DELETE FROM app_personal_details 
WHERE application_id IN 
(
    SELECT status_id 
    FROM dbo.app_status 
    WHERE submission_date <= DATEADD(month, -12, GETDATE()) 
) 
+0

우수. 고맙습니다. – tgriffiths

1

한 가지 방법은 그것을 그렇게처럼 일관성이 두 테이블을 통해 삭제 얻을 :

Select status_id 
Into #to_delete 
From dbo.app_status 
Where submission_date <= dateadd(month, -12, getdate()) 

Create Unique Clustered Index PK_X On #to_delete (status_id) 

Delete 
    app_personal_details 
From 
    app_personal_details apd Inner Join 
    #to_delete d On apd.application_id = d.status_id 

Delete 
    app_status 
From 
    app_status a Inner Join 
    #to_delete d On a.status_id = d.status_id 

당신이 가지고있는 경우가 출력 절을 사용하여 적은 문에 그것을 할 수, 또는 수 두 테이블 간의 삭제 캐스케이드

0

테이블이 큰 경우 트랜잭션 로그가 기하 급수적으로 증가하지 않도록 일괄 처리에서 삭제하는 것이 좋으며 SQL Server는 더 빨리 처리합니다.

DELETE TOP (N) ...로 삭제할 행을 제한하거나 특정 기간을 삭제하여 행을 제한 할 수 있습니다.