这是之前在网上见到的一道题,后来心里略微想了想 觉得应该可能,所以就一闪而过了,之前去面试晨光的时候面试者问了我这道问题,当时也只是把自己的想法说了一下,可能因为当时面试的感觉不太好,面试官也没有追究细节(可能他觉得追究细节会显示他懂得太少于是就没有问我了吧 哈哈)
题目有点绕 我写个简单的例子 大家就都懂了
学生表 A
ID NAME
1 tom
1 tom
2 jerry
3 henry
3 henry
学生表 B
ID NAME
1 TOM
2 JERRY
请问如何在不使用 in exist 等关键字的情况下 筛选出 在B表中不存在的A表中剩余的学生呢
当时的想法很简单 很直观
首先做出 a left join b 之后的表 然后再做出 a inner join b 的表
用这两个结果表 进行 差(减) 运算之后 剩余的 就是 没出现过的了,感觉好像可行,但是深思就觉得不行了,因为问题就处在 怎么做这个差运算上。后来问了几个同事 一直没有结果,今天正好问了一位leader
他想了一下 告诉我说 其实很简单的
就是 左连之后 加入一个 判断条件 右边剩余的 字段 需要为 null 那么这样的 结果就是 右边不存在的结果
sql 可以为
select a.*,b.* from a left join b on a.id=b.id
where b.id is null
select 里边可以再加个 distinct 更友好一点