好久没写博客了,虽然在技术的道路上越走越远,但是还是得不定时更新一下,前段时间有人提出一个需求,要求在用户表中选取出电话号码相同的用户,也就是一个电话号码对应多个用户,这样这个号码就不真实了(PS:设计数据库的时候咋不考虑一下?),于是就开始纠结与这个问题,最后用最笨的方法选取出需要的数据,记录一下。
ID | A | B | C | D |
1 | a | 11 | ab | fdsa |
2 | d | 12 | abc | erdf |
3 | b | 13 | af | fdsa |
4 | m | 14 | at | fda |
5 | c | 11 | fd | fdsa |
如上表所示,我们假设B列为电话号码列,A列为用户编号列,那么可以看出,11号码对应了2个用户,a和c,所以,这里就需要选取出1和5列数据。
我的做法是:
首先选取出在记录中该号码所对应的记录数大于1的结果。(小于等于1的结果肯定不会存在重复的数据)
select B from (select B,count(B) cou from table group by B) where cou >1
这样选取出有重复号码的B的值之后,选取出A,B不同的列。(避免同一个A,B值对应多条记录)
select distinct A,B from table where B in ( select B from (select B,count(B) cou from table group by B) where cou >1)
选取出不同的A,B列之和,由于可能存在A,B列对应多条数据的情况,所以需要进行再一次的过滤:
select B from (select B,count(*) cou from (select distinct A,B from table where B in ( select B from (select B,count(B) cou from table group by B) where cou >1) ) ) where cou>1
至此,就选取出了所有不真实的B列的数据,再在表中选取出包含选取出的B列的数据的不同的A,B列的值即可。
这个方法很麻烦,以后学了更多的sql之后希望能找到更好的解决方案。