oracle 面试问题

yjytiantang 2012-07-01 12:03:13
前几天去面试,遇到2个问题:

1, 有两个大表 A , B
如何取出 A 表有但是B表没有的数据?

2,有一个大表 A ,某一字段 ID 有重复记录,
如何将ID重复的记录删除只保存一笔?

以上问题在平时工作中也会经常遇到,也都解决过,不过数据量都不大(最多的是千万条记录)。

当时考虑到面试的岗位是移动公司的数据挖掘,数据量肯定巨大,一时没想出来什么好的办法。
回答的是: 1 ,用hash 连接进行运算,但是对hash 运算不是很熟悉,没能写出来。
2, 使用 max函数取rowid 关联。

由于都是手写sql,感觉做的不是很好。

各位有什么好的思路,不妨探讨一下,谢谢~
...全文
256 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
binsweet 2012-07-09
  • 打赏
  • 举报
回复
1、肯定用not exists效率最高
2、DELETE FROM t1 b
WHERE EXISTS
(SELECT 1
FROM t1 a
WHERE b.a1 = a.a1
GROUP BY a1
HAVING COUNT(a1) > 1 AND b.rowid <> MAX(a.rowi))
槑党--一缕风 2012-07-09
  • 打赏
  • 举报
回复
数据量大 应该是用not exists

去掉重复数据 应数据库的伪列 rowid
shi_yzeng 2012-07-09
  • 打赏
  • 举报
回复
1.select * from a where not exists(select * from b where a.和B表关联的键值 = b.和A表关联的键值);
horizonlyhw 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 2 楼 的回复:

千万条 其实也可以了 ~ ·


千万条是我平时处理的数据,能解决。
面试问的环境是移动的通话记录信息(亿条级别的),所以不是很确定用什么方法?
[/Quote]

我的理解是

万和千万有差别

千万和亿 处理方法上应该没差别~ 哈
reg13141 2012-07-02
  • 打赏
  • 举报
回复
我自己测试了一下,
A表和B表都1千万条记录,
使用minus的查询时间是最长的,最快的是not EXITS,其次是JOIN
如果是亿万的话,应该是not EXITS最快的吧,

到底用哪个要看实际情况的吧,
yjytiantang 2012-07-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

千万条 其实也可以了 ~ ·
[/Quote]

千万条是我平时处理的数据,能解决。
面试问的环境是移动的通话记录信息(亿条级别的),所以不是很确定用什么方法?
yjytiantang 2012-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

1、主键直接MINUS
2、用分析函数
[/Quote]

有考虑过用minus直接运算,但是数据量应该是很大的(亿条级别的),如果用minus的话,会不会很慢?
陈字文 2012-07-01
  • 打赏
  • 举报
回复
1、 minus
2、 根据条件得到rowid 根据rowid 作为条件删除
陈字文 2012-07-01
  • 打赏
  • 举报
回复
1、 minus
2、 根据条件得到rownum 根据rownum作为条件删除
allen519 2012-07-01
  • 打赏
  • 举报
回复
关注一下这个帖子,以后再看看
horizonlyhw 2012-07-01
  • 打赏
  • 举报
回复
千万条 其实也可以了 ~ ·
秋雨飘落 2012-07-01
  • 打赏
  • 举报
回复
1、主键直接MINUS
2、用分析函数

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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