为了账号安全,请及时绑定邮箱和手机立即绑定

关于distinct 的疑问?

假如有这么一张表users,表中有id, username, salary三个字段,那么使用语句:select distinct username from users。只会显示不重复字段username的记录。那么问题来了,如果我想要显示所有的字段记录,并且过滤掉字段username中重复的记录,这时可以使用以下语句:select distinct username, id, salary from users; 那么,问题又来了,上面这语句有几个问题:

1、select distinct username 格式是固定死的,不能写成select id, distinct username;这就打乱了表中字段输出的顺序。

2、此语句需要列出所有字段,如果表中有几十个,几百个字段,也需要全部列出来么?

在mysql中可以用group by来进行分组,过滤掉指定字段的重复记录,并输出分组后的全部字段记录。语句可以这么写:

select * from users group by username.

在oracle中要达到同样的效果,该怎么办,求大神指导!!

正在回答

4 回答

暂时没有想到什么好办法,oracle中select的字段去除聚合函数中使用的,其他字段都要出现在group by中,这就有点坑了。。

1 回复 有任何疑惑可以回复我~

distinct 表示去重,只要两行中的任何一个字段不一样就是不同的。

问题1、select distinct username 格式是固定死的,,不能写成select id, distinct username;这就打乱了表中字段输出的顺序。

答复:这个是书写规范,并不能将distinct位置随意放,它不是检查指定的字段是不是相同,而是检查要查询的字段的所有字段,两行中的任何一个字段不一样就是不同的。

问题2、此语句需要列出所有字段,如果表中有几十个,几百个字段,也需要全部列出来么?

你想查什么字段就查什么字段,包括SELECT Distinct  * FROM emp; 这样书写也是可以的。

问题3.在mysql中可以用group by来进行分组,过滤掉指定字段的重复记录,并输出分组后的全部字段记录。语句可以这么写:select * from users group by username.

这样是不太可取的,要注意:在统计查询中,select子句后只允许出现分组字段和统计函数,二其他任何字段都是不允许出现的。

好的,希望能对你有帮助。谢谢!

2 回复 有任何疑惑可以回复我~

select * from users t where t.id in (select a.id from users a group by a.id having count(a.username)<2),看下这样符合你的要求不

0 回复 有任何疑惑可以回复我~
#1

pusamm花黎

查出来还是有重复的username 。
2018-05-18 回复 有任何疑惑可以回复我~

暖一下回复,也是小白

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Oracle数据库开发必备利器之SQL基础
  • 参与学习       160642    人
  • 解答问题       641    个

为你带来Oracle开发必备的sql基础,为后续课程学习打下好的基础

进入课程

关于distinct 的疑问?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信