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

       好久没写博客了,虽然在技术的道路上越走越远,但是还是得不定时更新一下,前段时间有人提出一个需求,要求在用户表中选取出电话号码相同的用户,也就是一个电话号码对应多个用户,这样这个号码就不真实了(PS:设计数据库的时候咋不考虑一下?),于是就开始纠结与这个问题,最后用最笨的方法选取出需要的数据,记录一下。

      

IDABCD
1a11abfdsa
2d12abcerdf
3b13affdsa
4m14atfda
5c11fdfdsa

如上表所示,我们假设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之后希望能找到更好的解决方案。

    原文作者:rain_bow_iris
    原文地址: https://blog.csdn.net/rain_bow_iris/article/details/35231733
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞