0

我的帖子

个人中心

设置

  发新话题
比如说,有一个SQl表,里面有很多数据,怎么随机在这个表里面删除30%这个表的数据



DELETE TOP 30 PERCENT
FROM [MyTab]
WHERE YourConditions



SQL Server 2008 MCITP | SQL Server 2012 MCSE | SQL Server MVP | MySQL 5.6 OCP | Oracle 11g OCP
DELETE FROM [MyTab]
WHERE YourIdField IN
(
  SELECT TOP 30 PERCENT
    YourIdField
  FROM [MyTab]
  WHERE YourConditions
  ORDER BY NEWID()
)



SQL Server 2008 MCITP | SQL Server 2012 MCSE | SQL Server MVP | MySQL 5.6 OCP | Oracle 11g OCP
DELETE
FROM Person.Person
TABLESAMPLE (30 PERCENT)

随机取样30%?



我的51CTO博客

SQL Server MCITP, MVP, MCT, DBA
DELETE
FROM Person.Person
TABLESAMPLE (30 PERCENT)

随机取样30%?



引用:
原帖由 iolfno 于 2017-7-17 23:29 发表
DELETE
FROM Person.Person
TABLESAMPLE (30 PERCENT)

随机取样30%?
是随机取样删除,你可以了解下 TABLESAMPLE 函数。
同样的表同样的数据,执行这条语句,每次删除的东西都不一样。
自己可以做个测试。 select   * from  tablename  TABLESAMPLE (30 PERCENT) 看看结果是不是随机取样




本帖最后由 lantshirt 于 2017-7-18 11:45 编辑
提示: 作者被禁止或删除 内容自动屏蔽
很厉害



oracle 里面是用sample()
本帖最近评分记录
  • seusoftware 无忧币 +11 热心广援 2017-8-9 10:51



现在居然可以这样玩了,厉害



现在居然可以这样玩了,厉害



刚刚试了下 tablesample 虽然说随机但是有很大一部分是连续的.  


然后我写了一个sql也是能达到效果

DECLARE @Num BIGINT
DECLARE @sum BIGINT
DECLARE @ID BIGINT
SELECT @SUM=COUNT(1) FROM test.dbo.ZY_HisTrack
SET @Num=@SUM*0.3
--PRINT @sum
WHILE @Num>0
BEGIN
    SET @ID=round(RAND()*@SUM,0)
    DELETE test.dbo.ZY_HisTrack WHERE ID=@ID
    IF @@ROWCOUNT<>0
      BEGIN
          SET @Num=@Num-1
          PRINT @ID
      END
    ELSE
       SET @Num=@Num
    ---删除
END

随机删除30%的的数据

我这里是有一个字段记录自增长的. 如果没有或者已经被删除的话使用下
改为 ROW_NUMBER()做下排序. 不过数据量大的话我这种写法不建议还是使用
tablesample




本帖最后由 陈嘉 于 2017-9-21 15:43 编辑
‹‹ 上一贴:小白,求助一道sql server2012恢复的题目   |   下一贴:SQL Server与Oracle的区别 ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2017 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com