如:
table:
id name
1 a
2 b
3 c
4 c
5 b
比如我想用一条语句查询得到name不重复的所有数据,使用distinct去掉多余的重复记录。
select distinct name from table
得到的结果是:
name
a
b
c
但同时我还想要得到id值,请问那该怎么办???!!!
12 个解决方案
#1
SELECT id, name FROM [TABLE] a WHERE (id IN (SELECT MIN(b.id) FROM [TABLE] b WHERE b.name = a.name))
#2
不好意思,可能是我举的例子有问题。假如是这样的表
table:
nj kemu name
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
我想要的结果是:
一年级 语文 如何做好考试
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
请问这样应该怎么办呢???十分感谢!!!!
table:
nj kemu name
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
我想要的结果是:
一年级 语文 如何做好考试
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
请问这样应该怎么办呢???十分感谢!!!!
#3
select * from tb where not exists(select 1 from tb t2 where name=tb.name and id>t2.id)
#4
declare @t table(id int,name varchar(2))
insert into @t select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 4,'c'
union all select 5,'b'
select *
from @t tb
where not exists(select 1 from @t t2 where name=tb.name and id>tb.id)
/*
id name
----------- ----
1 a
4 c
5 b
(所影响的行数为 3 行)
*/
*/
insert into @t select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 4,'c'
union all select 5,'b'
select *
from @t tb
where not exists(select 1 from @t t2 where name=tb.name and id>tb.id)
/*
id name
----------- ----
1 a
4 c
5 b
(所影响的行数为 3 行)
*/
*/
#5
来个简单的
select a.nj,a.kemu,a.name
from table1 a,
(select b.nj tnj,b.kemu tkemu from table1 b group by b.nj,b.kemu) t
where a.nj=t.tnj and a.kemu=t.tkemu
select a.nj,a.kemu,a.name
from table1 a,
(select b.nj tnj,b.kemu tkemu from table1 b group by b.nj,b.kemu) t
where a.nj=t.tnj and a.kemu=t.tkemu
#6
declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', ' 士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select *
from @t tb
where exists(select distinct * from @t tb)
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', ' 士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select *
from @t tb
where exists(select distinct * from @t tb)
#7
我的方法不可用
#8
declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', '士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select distinct * from @t tb
/*
nj kemu name
---------- ---------- --------------------
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
四年级 数学 亿毫日分亿克
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
(所影响的行数为 6 行)
*/
这样直接不重复?
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', '士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select distinct * from @t tb
/*
nj kemu name
---------- ---------- --------------------
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
四年级 数学 亿毫日分亿克
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
(所影响的行数为 6 行)
*/
这样直接不重复?
#9
有点迷糊,以上各位高手的方法我都一一试过了,可是好象都不可以啊,麻烦各位再帮忙想一想!!谢谢啦~!~~~
#10
alter table t add id int identity(1,1)
select min(id)id ,nj from t group by nj
select * from t where id in (select min(id)id from t group by nj)
alter table t drop column id
select min(id)id ,nj from t group by nj
select * from t where id in (select min(id)id from t group by nj)
alter table t drop column id
#11
此表结构设计错误,理论上讲没人写的出来,为什么呢?因为你的表里没有唯一ID,而数据库里是没有顺序ID的,即使写出来了,过段时间数据库中的记录增大了,sql的执行结果就不对了!
例:
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
说明:
select top 1 年级 form 表名 where 年级="一年级"
出的结果未必永远都是“一年级 语文 如何做好考试”,因为表以后增大了,出的结果可能就是其它的了。
你应该把表设计成这样(增加oid字段,为递增步长为1的主键索引)
oid 年级 科目 内容
1 一年级 语文 如何做好考试
2 一年级 语文 士大夫士大夫
3 二年级 语文 是士大夫是
4 三年级 数学 似的似的
5 四年级 数学 似的是反对是的
6 一年级 语文 士大夫士大夫
7 四年级 数学 亿毫日分亿克
select * from 表名 where oid in (select top 1 oid from 表名 group by 年级)
例:
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
说明:
select top 1 年级 form 表名 where 年级="一年级"
出的结果未必永远都是“一年级 语文 如何做好考试”,因为表以后增大了,出的结果可能就是其它的了。
你应该把表设计成这样(增加oid字段,为递增步长为1的主键索引)
oid 年级 科目 内容
1 一年级 语文 如何做好考试
2 一年级 语文 士大夫士大夫
3 二年级 语文 是士大夫是
4 三年级 数学 似的似的
5 四年级 数学 似的是反对是的
6 一年级 语文 士大夫士大夫
7 四年级 数学 亿毫日分亿克
select * from 表名 where oid in (select top 1 oid from 表名 group by 年级)
#12
我的问题能够解决要谢谢以上各位高手的帮忙,谢谢!!
#1
SELECT id, name FROM [TABLE] a WHERE (id IN (SELECT MIN(b.id) FROM [TABLE] b WHERE b.name = a.name))
#2
不好意思,可能是我举的例子有问题。假如是这样的表
table:
nj kemu name
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
我想要的结果是:
一年级 语文 如何做好考试
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
请问这样应该怎么办呢???十分感谢!!!!
table:
nj kemu name
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
我想要的结果是:
一年级 语文 如何做好考试
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
请问这样应该怎么办呢???十分感谢!!!!
#3
select * from tb where not exists(select 1 from tb t2 where name=tb.name and id>t2.id)
#4
declare @t table(id int,name varchar(2))
insert into @t select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 4,'c'
union all select 5,'b'
select *
from @t tb
where not exists(select 1 from @t t2 where name=tb.name and id>tb.id)
/*
id name
----------- ----
1 a
4 c
5 b
(所影响的行数为 3 行)
*/
*/
insert into @t select 1,'a'
union all select 2,'b'
union all select 3,'c'
union all select 4,'c'
union all select 5,'b'
select *
from @t tb
where not exists(select 1 from @t t2 where name=tb.name and id>tb.id)
/*
id name
----------- ----
1 a
4 c
5 b
(所影响的行数为 3 行)
*/
*/
#5
来个简单的
select a.nj,a.kemu,a.name
from table1 a,
(select b.nj tnj,b.kemu tkemu from table1 b group by b.nj,b.kemu) t
where a.nj=t.tnj and a.kemu=t.tkemu
select a.nj,a.kemu,a.name
from table1 a,
(select b.nj tnj,b.kemu tkemu from table1 b group by b.nj,b.kemu) t
where a.nj=t.tnj and a.kemu=t.tkemu
#6
declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', ' 士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select *
from @t tb
where exists(select distinct * from @t tb)
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', ' 士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select *
from @t tb
where exists(select distinct * from @t tb)
#7
我的方法不可用
#8
declare @t table(nj varchar(10),kemu varchar(10),name varchar(20))
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', '士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select distinct * from @t tb
/*
nj kemu name
---------- ---------- --------------------
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
四年级 数学 亿毫日分亿克
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
(所影响的行数为 6 行)
*/
这样直接不重复?
insert into @t select '一年级' , '语文' ,'如何做好考试'
union all select '一年级' , '语文' ,'士大夫士大夫'
union all select'二年级' , '语文', '是士大夫是'
union all select
'三年级' , '数学' , ' 似的似的'
union all select
'四年级' , ' 数学' , '似的是反对是的'
union all select
'一年级' , '语文', '士大夫士大夫'
union all select
'四年级' , '数学' , '亿毫日分亿克'
select distinct * from @t tb
/*
nj kemu name
---------- ---------- --------------------
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
四年级 数学 亿毫日分亿克
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
(所影响的行数为 6 行)
*/
这样直接不重复?
#9
有点迷糊,以上各位高手的方法我都一一试过了,可是好象都不可以啊,麻烦各位再帮忙想一想!!谢谢啦~!~~~
#10
alter table t add id int identity(1,1)
select min(id)id ,nj from t group by nj
select * from t where id in (select min(id)id from t group by nj)
alter table t drop column id
select min(id)id ,nj from t group by nj
select * from t where id in (select min(id)id from t group by nj)
alter table t drop column id
#11
此表结构设计错误,理论上讲没人写的出来,为什么呢?因为你的表里没有唯一ID,而数据库里是没有顺序ID的,即使写出来了,过段时间数据库中的记录增大了,sql的执行结果就不对了!
例:
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
说明:
select top 1 年级 form 表名 where 年级="一年级"
出的结果未必永远都是“一年级 语文 如何做好考试”,因为表以后增大了,出的结果可能就是其它的了。
你应该把表设计成这样(增加oid字段,为递增步长为1的主键索引)
oid 年级 科目 内容
1 一年级 语文 如何做好考试
2 一年级 语文 士大夫士大夫
3 二年级 语文 是士大夫是
4 三年级 数学 似的似的
5 四年级 数学 似的是反对是的
6 一年级 语文 士大夫士大夫
7 四年级 数学 亿毫日分亿克
select * from 表名 where oid in (select top 1 oid from 表名 group by 年级)
例:
一年级 语文 如何做好考试
一年级 语文 士大夫士大夫
二年级 语文 是士大夫是
三年级 数学 似的似的
四年级 数学 似的是反对是的
一年级 语文 士大夫士大夫
四年级 数学 亿毫日分亿克
说明:
select top 1 年级 form 表名 where 年级="一年级"
出的结果未必永远都是“一年级 语文 如何做好考试”,因为表以后增大了,出的结果可能就是其它的了。
你应该把表设计成这样(增加oid字段,为递增步长为1的主键索引)
oid 年级 科目 内容
1 一年级 语文 如何做好考试
2 一年级 语文 士大夫士大夫
3 二年级 语文 是士大夫是
4 三年级 数学 似的似的
5 四年级 数学 似的是反对是的
6 一年级 语文 士大夫士大夫
7 四年级 数学 亿毫日分亿克
select * from 表名 where oid in (select top 1 oid from 表名 group by 年级)
#12
我的问题能够解决要谢谢以上各位高手的帮忙,谢谢!!