慕圣0830664
2017-06-13 12:19
假如有这么一张表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中要达到同样的效果,该怎么办,求大神指导!!
暂时没有想到什么好办法,oracle中select的字段去除聚合函数中使用的,其他字段都要出现在group by中,这就有点坑了。。
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子句后只允许出现分组字段和统计函数,二其他任何字段都是不允许出现的。
好的,希望能对你有帮助。谢谢!
select * from users t where t.id in (select a.id from users a group by a.id having count(a.username)<2),看下这样符合你的要求不
暖一下回复,也是小白
Oracle数据库开发必备利器之SQL基础
160642 学习 · 641 问题
相似问题