关于同一表中A列和B列,选取出A列值相同的B列的sql语句

时间:2022-07-30 00:41:36

       好久没写博客了,虽然在技术的道路上越走越远,但是还是得不定时更新一下,前段时间有人提出一个需求,要求在用户表中选取出电话号码相同的用户,也就是一个电话号码对应多个用户,这样这个号码就不真实了(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之后希望能找到更好的解决方案。