SQL选择然后删除

时间:2012-10-22 13:51:54

标签: sql sql-server sql-server-2008

我需要从数据库表中清除一些旧数据。下面显示了两个表格, app_status app_personal_details

enter image description here

我有以下查询从 app_status 表中选择自今天起12个月后创建的所有记录(应用程序)

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

然后我要删除 app_personal_details 表中的所有记录,其中application_id存在于上面检索到的status_id列表中。

我希望这是有道理的。我想知道一种从两个表中删除数据的快捷方法。

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您可以使用子选择。

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

答案 2 :(得分: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

您可以使用输出子句在less语句中执行此操作,或者如果两个表之间有删除级联。

答案 3 :(得分:0)

如果表很大,你宁愿批量删除,这样你的事务日志就不会成倍增长,而且sql server会更快地处理它。

您可以通过删除TOP(N)...或删除特定日期范围来限制要删除的行。