面试时被问到的一个问题

2022-09-26 23:12:57 +08:00
 nnnneymarjr
有两张比较大的表,如何判断两张表中是否有相同的数据,以及如何将他们找出来?
请问大家有什么思路吗?
3621 次点击
所在节点    MySQL
14 条回复
infun
2022-09-26 23:23:34 +08:00
如果只是 SQL 的话,这样?
select a. * from a join b on al=b1 and a2=b2 and a3=b3 ...;
Jooooooooo
2022-09-26 23:24:30 +08:00
如果只需要看有没有的话

考虑下布隆过滤器
liprais
2022-09-27 01:45:01 +08:00
union all 之后 group by 全字段 having count > 1
nnnneymarjr
2022-09-27 10:07:06 +08:00
@infun 我当时就是这么说的,面试官也没给反馈,感觉跟他心中的答案差的挺远的😥
mazhan465
2022-09-27 10:32:01 +08:00
每条字段计算一遍 MD5 摘要保存到文件,然后排序,双指针比较,MD5 相同的加载对应行的数据进行验证比较
allforone
2022-09-27 11:00:51 +08:00
可能问的是 inner join 的具体实现?先确认一下是算法题还是 sql 题。算法题的话可能想考 sort merge join 或者 hash join 一些优化实现。
dog82
2022-09-27 11:14:28 +08:00
5 楼的思路很不错
lookStupiToForce
2022-09-27 11:15:36 +08:00
以 pgsql 为例,每行数据 hash 一下加上主键(单一主键或者联合主键都行)后再比较最好
如果下面的 sql 一次跑不出来,先分别生成两张表然后用那两张新表去做最后的 join 比对

with t1 as(
select f.primary_key,
md5(CAST((f.*) AS text)) as hash
from foo1 f
)
, t2 as(
select f.primary_key,
md5(CAST((f.*) AS text)) as hash
from foo2 f
)
select t1.primary_key
from t1 join t2 using (primary_key)
where t1.hash = t2.hash
agmtopy
2022-09-27 11:40:38 +08:00
猜?先比较索引字段,在比较其他?
nnnneymarjr
2022-09-27 12:00:40 +08:00
@mazhan465 是一个不错的思路
nnnneymarjr
2022-09-27 12:01:27 +08:00
@allforone 应该像是场景题
tobias7
2022-09-27 12:31:32 +08:00
@mazhan465 能否细说说
copper20
2022-09-27 12:50:56 +08:00
允许假阳性存在的话可以考虑布隆过滤器,线性时间能应该就能搞定了

*如果不是一道 SQL 题的话
zovencraig
2022-09-27 16:00:34 +08:00
首先是“比较大的表”,这个是坑,你要先反问并确认多少数据量以及使用的数据库,才能决定采用的方法;其次,就是看你面试的职位,是偏技术开发还是数据方面,再挑适合的实现方法。当然不排除面试官问的很随意……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/883155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX