有一张表如下:
name,phone
张三,11111
张经理,11111
张三,22222
李四,33333
王五,33333
王二,77777
小六,88888期望实现:将 name相同 or phone相同 的数据查出,返回像下面的结果:
name,phone
张三,11111
张经理,11111
张三,22222
李四,33333
王五,33333望各位大拿予以帮助.感谢.

解决方案 »

  1.   

    select * from tb a
     where exists(select 1 from tb where (name=a.name and phone<>a.phone)
                                    or (name<>a.name and phone=a.phone))
      

  2.   


    select *
    from tb
    where name in (select name from tb group by name having count(1) > 1)
    or phone in (select phone from tb group by phone having count(1) > 1)
      

  3.   

    select *
    from tb
    where name in (select name from tb group by name having count(1) > 1)
    union 
    select *
    from tb
    where phone in (select phone from tb group by phone having count(1) > 1)
      

  4.   

    一楼的不对吗?请问!!
    create table tb(name varchar(10),phone int)
    insert into tb
     select '张三',11111 union
     select '张经理',11111 union
     select '张三',22222 union
     select '李四',33333 union
     select '王五',33333 union
     select '王二',77777 union
     select '小六',88888 select * from tb a
     where exists(select 1 from tb where (name=a.name and phone<>a.phone)
                                    or (name<>a.name and phone=a.phone))
                                    
    /*
    name       phone
    ---------- -----------
    李四         33333
    王五         33333
    张经理        11111
    张三         11111
    张三         22222
      

  5.   


    抱歉, 您的也是正确的. 但是, 对于多个字段组合的时候,例如5个字段,需要对where条件进行重复拼装工作,同时我们这儿的开发规范不让用<>,所以选择了3楼的方法,见谅. 另,由衷的感谢您的指导.
      

  6.   

    老实说,聚合加union效率并不高,既然公司有规范,那就照着做吧。天朝的规范也很多。正如动车事故以后的规范一般。