如何从数据库sql server 2012中删除除前10条记录以外的所有记录?

时间:2014-08-25 12:47:01

标签: sql sql-server

当然我知道我可以为DB中的每个表发出delete语句,但我的问题是 有没有任何技巧可以通过一个语句自动执行此操作。 我有大量的数据,为了测试目的,我需要一个缩小版本的数据库。 前十名记录只会没事。

5 个答案:

答案 0 :(得分:2)

我建议您使用以下命令从数据库中删除90%的数据,以保留10条记录,您需要更多的特定于表的查询,但是如果要从您的所有表中删除90%的数据数据库可以使用以下系统存储过程。

EXECUTE sp_MSforeachtable 'DELETE TOP (90) PERCENT FROM  ?'

答案 1 :(得分:1)

根据您的问题,我了解您要删除表中的所有记录,并仅保留前10条记录以执行某些测试

这很简单 - 只需按照以下步骤操作

   1.  select top 10 *  INTO #tmp_toprecords FROM  [table_name]

   2.  truncate table [table_name]

   3.  INSERT INTO [table_name] SELECT * FROM #tmp_toprecords 

我在上面的代码中所做的是 -

  1. 从主表到临时表中选择了所有前10条记录

  2. 从主表中删除或截断数据,将数据插回

  3. 临时表中的主表。

  4. 我希望上述解决方案可以帮助您快速将数据缩减到多个表中并开始测试...

答案 2 :(得分:0)

您可以尝试以下查询。

假设您有一个唯一键(id),您可以按照以下步骤操作;

Delete From TableX
where  Id not in (Select Top (10) Id form TableX order by Id)

答案 3 :(得分:0)

每个顶级表需要一个语句,即一个不引用另一个表的表。在COUNTRY,ADDRESS,PERSON中,每个人都有一个地址,地址位于国家/地区,COUNTRY表格就是这样的顶级表格。对于这些表中的每一个,您都必须编写一个delete语句来定义该表的前10个记录。 (对于国家而言,前10个记录可以是大多数地址中使用的记录,也可以是字母表中的第一个或最接近日本的记录。您需要使用规则来定义每个表的最高记录。)

然后,如果所有表都通过ON DELETE CASCADE相关,则删除语句将删除从属表的所有链接记录。但是依赖表本身仍然可以有10个以上的记录,因此,对于每个依赖表,定义前10个,编写适当的语句并删除。等等。

如果表没有通过ON DELETE CASCADE链接,那么您必须从另一侧开始,使用最后一个叶子记录,即上例中的PERSON。您必须编写一个(相当复杂的)删除语句来删除所有人,除了那些地址位于前10个国家之一并且其地址本身被认为是前10名的人。然后,如果剩余10个以上的记录,请删除PERSON中不考虑前10个的记录。然后继续下一级(例如ADDRESS),直到最后从顶部表中删除。

所以,不,没有一个声明来减少你的关系数据库。还有很多工作要做。

答案 4 :(得分:0)

您必须提供要删除行的column_name aginst。 请使用以下查询。 在我的情况下,我使用了ID' column_name和' delete_top_10' as table_name。

 DELETE TOP (10) 
 FROM delete_top_10
 WHERE id=1