2012-10-22 156 views
3

我需要从我的数据库表中清除一些旧数据。下面显示了两个表,app_statusapp_personal_detailsSQL选择然后删除

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表的所有记录,其中application_id存在于上面检索到的status_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,但之后从数据库中删除相同的项目? –

+0

我的意思是,我必须根据ID进行2个查询和删除吗? Ir有没有select + delete的方法? –

2

您可以使用子选择。

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)...或通过删除特定日期范围来限制要删除的行。