CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

sql语句 查重名 ?

楼主xili()2005-07-26 23:57:37 在 MS-SQL Server / 基础类 提问

表   ttt(   name   varchar(20),   addr   varchar(20))  
   
  其中   name有重复数据.    
   
  怎么查出   name   重复的   内容.     没有重复的name不需要出现到结果里.  
  问题点数:50、回复次数:17Top

1 楼vivianfdlpw()回复于 2005-07-27 00:04:29 得分 45

select   *   from   ttt   t    
  where   exists(seelct   1   from   ttt   where   name=t.name   and   addr<>t.addr)Top

2 楼vivianfdlpw()回复于 2005-07-27 00:08:01 得分 0

--创建测试环境  
  create   table   ttt  
  (  
      name   varchar(20),  
      addr   varchar(20)  
  )  
  insert   ttt  
  select   '张三','中国北京市'   union   all  
  select   '李四','中国上海市'   union   all  
  select   '王五','中国天津市'   union   all  
  select   '张三','中国四川省'  
   
  --测试  
  select   *   from   ttt   t    
  where   exists(select   1   from   ttt   where   name=t.name   and   addr<>t.addr)  
   
   
  --删除测试环境  
  drop   table   ttt  
   
  --结果  
  /*  
  name                                   addr                                    
  --------------------   --------------------    
  张三                                       中国北京市  
  张三                                       中国四川省  
   
  (2   row(s)   affected)  
  */Top

3 楼vivianfdlpw()回复于 2005-07-27 00:10:41 得分 0

--或者:  
  select   t.*   from   ttt   t    
  join   ttt   A   on   t.name=A.name   and   t.addr<>A.addrTop

4 楼filebat(Mark)回复于 2005-07-27 00:22:39 得分 1

vivianfdlpw,   你这么快就上星了.  
  PFPF啊.Top

5 楼xili()回复于 2005-07-27 00:38:12 得分 0

vivian反应真快  
   
  addr   可以相同的呀.   还能用这方法吗?Top

6 楼vivianfdlpw()回复于 2005-07-27 00:41:22 得分 0

--创建测试环境  
  create   table   ttt  
  (  
      name   varchar(20),  
      addr   varchar(20)  
  )  
  insert   ttt  
  select   '张三','中国北京市'   union   all  
  select   '李四','中国上海市'   union   all  
  select   '王五','中国天津市'   union   all  
  select   '张三','中国四川省'  
   
  --测试  
  declare   @tb   table(ID   int   identity,name   varchar(20),addr   varchar(20))  
  insert   @tb(name,addr)   select   *   from   ttt  
  select   name,addr   from   @tb   t    
  where   exists(select   1   from   @tb   where   name=t.name   and   ID<>t.ID)  
   
   
  --删除测试环境  
  drop   table   ttt  
   
  --结果  
  /*  
  name                                   addr                                    
  --------------------   --------------------    
  张三                                       中国北京市  
  张三                                       中国四川省  
   
  (2   row(s)   affected)  
  */  
  Top

7 楼vivianfdlpw()回复于 2005-07-27 00:42:28 得分 0

to   filebat(Mark):  
  昨天就升星了:)Top

8 楼xili()回复于 2005-07-27 00:45:32 得分 0

试了一下,如果去掉   and   t.addr<>A.addr   就不称哦Top

9 楼xili()回复于 2005-07-27 00:48:01 得分 0

表数据很大,建临时表   不妥吧.  
   
  而且   identity字段只能用于   sql   server.  
   
  我现在只有oracle的环境.  
   
  求一个   可移植的,通用的方法.Top

10 楼xili()回复于 2005-07-27 00:50:10 得分 0

如果要建临时表,    
  我宁愿在   c程序里来   计算了.  
  那样也只要遍历一次就好了.Top

11 楼vivianfdlpw()回复于 2005-07-27 00:57:45 得分 0

你的表只有这两个字段?Top

12 楼vivianfdlpw()回复于 2005-07-27 01:05:13 得分 0

--创建测试环境  
  create   table   ttt  
  (  
      name   varchar(20),  
      addr   varchar(20)  
  )  
  insert   ttt  
  select   '张三','中国北京市'   union   all  
  select   '李四','中国上海市'   union   all  
  select   '王五','中国天津市'   union   all  
  select   '张三','中国北京市'   union   all  
  select   '李四','中国深圳市'  
   
  --测试  
  select   *   from   ttt   t    
  where    
            (select   count(1)   from   ttt   where   name=t.name)>1  
  order   by   name  
   
  --删除测试环境  
  drop   table   ttt  
   
  --结果  
  /*  
  name                                   addr                                    
  --------------------   --------------------    
  李四                                       中国上海市  
  李四                                       中国深圳市  
  张三                                       中国北京市  
  张三                                       中国北京市  
   
  (4   row(s)   affected)  
  */  
  Top

13 楼xiaonvjing(飞扬)回复于 2005-07-27 05:15:49 得分 1

表   ttt(   name   varchar(20),   addr   varchar(20))  
   
  其中   name有重复数据.    
  select   *   from   ttt   where   name   in   (select   name   from   ttt   group   by     name   having   count(name)>1)Top

14 楼sxycgxj(云中客)回复于 2005-07-27 07:40:28 得分 1

来晚了,好像问题已经解决了,项一下吧Top

15 楼MorningTea(一勺抹茶)回复于 2005-07-27 08:14:28 得分 1

filebat(Mark)比较后知后觉,我天天上,昨天就发现   vivianfdlpw()   后面的东西好像少了,呵呵  
    原来他升星了,可惜不熟,否则一定问候一句,呵呵  
   
    问题都解决了,我也发一个,不过没有没有那么简便,惭愧:  
  select   *   from   ttt   t    
    where   exists     (select   top   b.name     from   (select   top   2   t1.name   from   ttt   t1    
  where   name=t1.name   order   by   t1.name)   b  
  where   b.name   =   t.name)  
  order   by   name  
  Top

16 楼hanshufan(小帆)回复于 2005-07-27 10:29:13 得分 1

select   *   from   ttt   t    
  where    
            (select   count(1)   from   ttt   where   name=t.name)>1  
  order   by   name  
  好办法,呵呵学习!Top

17 楼xili()回复于 2005-07-27 10:41:24 得分 0

感谢各位,这个坛子气氛不错.  
  决定以后也多使用ms的产品.Top

相关问题

  • 查错:SQL语句
  • SQL查询语句
  • Sql 查询语句
  • SQL查询语句
  • sql语句查询
  • sql查询语句
  • sql查询语句
  • SQL查询语句
  • Sql查询语句
  • sql查询语句

关键词

  • 中国
  • 测试
  • 数据
  • ttt
  • tttselect
  • union allselect
  • addr
  • varchar
  • 四川省
  • 北京市

得分解答快速导航

  • 帖主:xili
  • vivianfdlpw
  • filebat
  • xiaonvjing
  • sxycgxj
  • MorningTea
  • hanshufan

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo