一个sql语句(不好意思刚刚那个帖子结贴了,另开一个)

iammac 2011-09-13 02:55:58
刚刚我问题没有问太清楚。
一个order表,删除相同order key条件下比它date小的其他数据,并且如果order key和date都相同,选取top 1的数据。也就是不能有duplicate的order key存在哪怕date相等。
所以如果用not exists key=t.key and order < t.order,有可能会留下多条order和key都相同的数据。

我能想到的是先group by key取max(date),然后inner join 原来的order表,但是无论是group by和order的原来的主表都是蛮大的表(billion级别),所以想问一下有没有可以直接delete掉的方法。
谢谢
...全文
89 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO寒枫Oo 2011-09-13
  • 打赏
  • 举报
回复
select into 不产生log的。
iammac 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxpbs8851 的回复:]

需要删除的数据越多 上面的方法越快 越安全。
[/Quote]
谢谢,不过select into不是也产生log的吗?
oO寒枫Oo 2011-09-13
  • 打赏
  • 举报
回复
需要删除的数据越多 上面的方法越快 越安全。
oO寒枫Oo 2011-09-13
  • 打赏
  • 举报
回复
1.
select order_key,order_date
into order_temp
from
(select * ,row_number(partition by order_key order by order_date) rn from order) a
where a.rn=1
2.
truncate table order
drop table order
3.
exec sp_rename 'order_tmp','order','column'
iammac 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]

是在是害怕的话 先加个自增列 在删除吧

还是用EXISTS
[/Quote]
excellent idea...我怎么没想到
谢谢
--小F-- 2011-09-13
  • 打赏
  • 举报
回复
key+date如果设置为联合主键的话就没这么多问题了
中国风 2011-09-13
  • 打赏
  • 举报
回复
delete t
from (select *,row=row_number()over(partition by [Order key] order by date desc) from tableName)t
where row>1
--小F-- 2011-09-13
  • 打赏
  • 举报
回复
是在是害怕的话 先加个自增列 在删除吧

还是用EXISTS
NBDBA 2011-09-13
  • 打赏
  • 举报
回复
你的意思,key+date还是有重复的,哪有无不重复的字段,需要一个不重复的字段来判断删除才能保证性能,否则不如重建表,去重过程导入来得快

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧