SQL server中的Select DISTINCT对某个字段约束的用法?

dapei_712 2007-08-16 09:31:51
下面先来看看例子:
表:table
字段:id name
1 a
2 b
3 c
4 c
5 b
——目标:我想用一条语句查询得到name不重复的所有数据:

(1)select distinct name from table
得到的结果是:
name
a
b
c
好像达到效果了,可是,我想要得到的是id值呢?
(2)改一下查询语句吧: select distinct name, id from table
结果会是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

(3)我们再改改查询语句: select id, distinct name from table
很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

(4)用count写:select id, name, count(distinct name) from table group by name

结果报错:
服务器: 消息 8120,级别 16,状态 1,行 1
Column 'table.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

——求救:该怎么写?才能实现这个目标呢?
...全文
1295 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuwuman 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dapei_712 的回复:]
——目前看来,还是“dawugui(潇洒老乌龟) ”的答案更加合理、简洁一些;
select name , min(id) id from tb group by name
——不过,如果是想随机的取id的值呢?又有何办法?
谢谢。先结贴吧,再讨论
[/Quote]果然很精巧啊
che2piaopiao 2009-01-06
  • 打赏
  • 举报
回复
123
yrwx001 2007-08-16
  • 打赏
  • 举报
回复
select B.name,B.id from table B where not exists (select 1 from table A where A.name = B.name AND B.id_key > A.id_key)
dapei_712 2007-08-16
  • 打赏
  • 举报
回复
——目前看来,还是“dawugui(潇洒老乌龟) ”的答案更加合理、简洁一些;
select name , min(id) id from tb group by name
——不过,如果是想随机的取id的值呢?又有何办法?
谢谢。先结贴吧,再讨论
mengmou 2007-08-16
  • 打赏
  • 举报
回复
那就得用我写的那个了
fa_ge 2007-08-16
  • 打赏
  • 举报
回复
select distinct name , min(id) id from tb group by name
dapei_712 2007-08-16
  • 打赏
  • 举报
回复
——谢谢帮助!不过,您的这个方法比较有局限性,倘若多个字段:
表:table
字段:id_key name id
1 a 6
2 b 13
3 a 6
4 b 13
5 b 55
——照您的做法,得到的结果估计是:
name id1
a 6
a 6
b 55
——谢谢,是否有更加健全的方法呢?提问中仅仅给的是一个例子而已。
mengmou 2007-08-16
  • 打赏
  • 举报
回复
确实,呵呵
fa_ge 2007-08-16
  • 打赏
  • 举报
回复
2)改一下查询语句吧: select distinct name, id from table
结果会是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。
------------------------
distinct 是根據你寫的select 字段列表來來去重復的,只有當字段列表中的值全部重復時,才會去重復
dawugui 2007-08-16
  • 打赏
  • 举报
回复
好象我这个最简单吧.
fa_ge 2007-08-16
  • 打赏
  • 举报
回复
select * from tablename a where not exists(select 1 from tablename where a.name = name and a.id > id)
dawugui 2007-08-16
  • 打赏
  • 举报
回复
select name , min(id) id from tb group by name
mengmou 2007-08-16
  • 打赏
  • 举报
回复
--建立测试环境
create table tablename(id int,name varchar(10))
insert tablename(id,name)
select '1','a' union all
select '2','b' union all
select '3','c' union all
select '4','c' union all
select '5','b'
go
--执行测试语句
select * from tablename a
where not exists(select 1 from tablename where a.name = name and a.id > id)
go
--删除测试环境
drop table tablename
go
/*--测试结果
id name
----------- ----------
1 a
2 b
3 c

(3 row(s) affected)
*/



mengmou 2007-08-16
  • 打赏
  • 举报
回复
select * from tablename a where not exists(select 1 from tablename where a.name = name and a.id > id)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧