要查询几个字段的值,要求其中一个字段值不重复,这条SQL语句怎么写啊?

时间:2022-08-23 15:04:35
假设有这张表:
用户ID   姓名   年龄
-------------------
111     张三    26
222     李四    25
333     王五    30
111     张三    26

这里有两个张三,我想把重复的姓名去掉,这条SQL语句如何写?我用distinct怎么做都不行啊!
select disinct id,name,age from xxx
select disinct(name),id,age from xxx
类似以上两条都不行~~

16 个解决方案

#1




select distinct 用户ID  ,     姓名    ,   年龄  from t

#2



用户ID        姓名         年龄          
----------- ---------- ----------- 
111         张三         26
222         李四         25
333         王五         30

(所影响的行数为 3 行)

#3



create table #
(用户ID  int,      姓名    varchar(10),   年龄 int)
insert into #
select 111,           '张三',         26  union all
select 222,           '李四',         25  union all
select 333,           '王五',         30  union all
select 111,           '张三',         26 

select distinct * from #

/*
用户ID        姓名         年龄          
----------- ---------- ----------- 
111         张三         26
222         李四         25
333         王五         30

(所影响的行数为 3 行)
*/

#4


select   disinct   id,name,age   from   xxx 


----------------
只要你的表的两条是完全重复的,就一定可以去掉其中的几条.如果不能的话,检查下某个字段值是不是有空格

#5


晕了,我的问题没说清楚,忽略了一个重要的信息,就是相同姓名的记录还有其他字段的值却是不一样的,也就是说每条相同姓名的记录并不完全相同。。。。各位高手,不好意思,问题说错了,我该怎么办啊?

#6


假设的表应该是这样的:
用户ID       姓名       年龄      购买产品      购买日期
------------------------------------------------------
111           张三         26    手机          2007-10-1
222           李四         25    MP3         2007-10-22
333           王五         30    MP3         2006-11-2
111           张三         26    电脑          2007-12-6

我只想查出姓名不重复的记录,却要查询所有字段。当然,这个表只是假设,不存在合不合理的讨论。

#7


我比楼主更晕,上面的记录张三两条,想要哪条

#8




--当两条重,取日期大的一条
select * from t a
where not exists (select 1 from t where a.用户ID=用户ID a.姓名=姓名 and 购买日期>a.购买日期)

#9


谢谢鶴嘯九天~~,像你的查询条件,假如不同产品的购买日期是相同的呢?
事实上,对于姓名相同的记录,我只需要要任意一条,无须考虑任何情况啊。
不知道你还能不能再挑战一下自己?谢谢啊!

#10


不知道你还能不能再挑战一下自己?
--------------------
呵呵,楼主好会说话.这个表每一个字段都有重复的可能吗?有没有唯一字段呢,如果表中字段好多的话
不可能写好多对比条件.只有加上个自动编号,来唯一区分它们

#11


对,表中好多字段,而且表结构我不能随意更改。有一个主键ID是确保不重复的,其他的哪个字段会重复哪个不会,都很难预料,但姓名一定会有重复,而所需要查询显示的信息,姓名却又不能重复出现,其他字段则根据姓名对应的来显示,排除掉的无需显示。
其实我已有预案,就是查询所有记录出来,在迭代显示记录集的过程中进行与上一条的对比,只要姓名与上一条相同则不显示。但我经常要遇到这种情况,实在想知道到底能否用一条语句查询出来。也许本身就无法实现,或者没人会去这样要求查询。
再次谢谢您!

#12



有个id 就好


select * from t a
where not exists (select 1 from t where a.用户ID=用户ID a.姓名=姓名 and id>a.id)



--这样就可以把这个表所有重复的记录去掉了,写法很多,用 exists 执行效高

#13


一看就觉得靠谱,一试就真的行了耶~~你那颗红星真帅!
总算了却心结,非常感谢啊!!@>>-------

#14


帮顶,学习,再学习~~

#15


一切都是日期 影响的

#16


看明白了 所有,感激LZ 和 fa_ge 也解决了我的一个大问题

#1




select distinct 用户ID  ,     姓名    ,   年龄  from t

#2



用户ID        姓名         年龄          
----------- ---------- ----------- 
111         张三         26
222         李四         25
333         王五         30

(所影响的行数为 3 行)

#3



create table #
(用户ID  int,      姓名    varchar(10),   年龄 int)
insert into #
select 111,           '张三',         26  union all
select 222,           '李四',         25  union all
select 333,           '王五',         30  union all
select 111,           '张三',         26 

select distinct * from #

/*
用户ID        姓名         年龄          
----------- ---------- ----------- 
111         张三         26
222         李四         25
333         王五         30

(所影响的行数为 3 行)
*/

#4


select   disinct   id,name,age   from   xxx 


----------------
只要你的表的两条是完全重复的,就一定可以去掉其中的几条.如果不能的话,检查下某个字段值是不是有空格

#5


晕了,我的问题没说清楚,忽略了一个重要的信息,就是相同姓名的记录还有其他字段的值却是不一样的,也就是说每条相同姓名的记录并不完全相同。。。。各位高手,不好意思,问题说错了,我该怎么办啊?

#6


假设的表应该是这样的:
用户ID       姓名       年龄      购买产品      购买日期
------------------------------------------------------
111           张三         26    手机          2007-10-1
222           李四         25    MP3         2007-10-22
333           王五         30    MP3         2006-11-2
111           张三         26    电脑          2007-12-6

我只想查出姓名不重复的记录,却要查询所有字段。当然,这个表只是假设,不存在合不合理的讨论。

#7


我比楼主更晕,上面的记录张三两条,想要哪条

#8




--当两条重,取日期大的一条
select * from t a
where not exists (select 1 from t where a.用户ID=用户ID a.姓名=姓名 and 购买日期>a.购买日期)

#9


谢谢鶴嘯九天~~,像你的查询条件,假如不同产品的购买日期是相同的呢?
事实上,对于姓名相同的记录,我只需要要任意一条,无须考虑任何情况啊。
不知道你还能不能再挑战一下自己?谢谢啊!

#10


不知道你还能不能再挑战一下自己?
--------------------
呵呵,楼主好会说话.这个表每一个字段都有重复的可能吗?有没有唯一字段呢,如果表中字段好多的话
不可能写好多对比条件.只有加上个自动编号,来唯一区分它们

#11


对,表中好多字段,而且表结构我不能随意更改。有一个主键ID是确保不重复的,其他的哪个字段会重复哪个不会,都很难预料,但姓名一定会有重复,而所需要查询显示的信息,姓名却又不能重复出现,其他字段则根据姓名对应的来显示,排除掉的无需显示。
其实我已有预案,就是查询所有记录出来,在迭代显示记录集的过程中进行与上一条的对比,只要姓名与上一条相同则不显示。但我经常要遇到这种情况,实在想知道到底能否用一条语句查询出来。也许本身就无法实现,或者没人会去这样要求查询。
再次谢谢您!

#12



有个id 就好


select * from t a
where not exists (select 1 from t where a.用户ID=用户ID a.姓名=姓名 and id>a.id)



--这样就可以把这个表所有重复的记录去掉了,写法很多,用 exists 执行效高

#13


一看就觉得靠谱,一试就真的行了耶~~你那颗红星真帅!
总算了却心结,非常感谢啊!!@>>-------

#14


帮顶,学习,再学习~~

#15


一切都是日期 影响的

#16


看明白了 所有,感激LZ 和 fa_ge 也解决了我的一个大问题