问答详情
源自:6-5 Oracle查询语句之给字段设置别名

关于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中要达到同样的效果,该怎么办,求大神指导!!

提问者:慕圣0830664 2017-06-13 12:19

个回答

  • botao555
    2017-06-14 14:24:34
    已采纳

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

  • 小杰子123
    2017-07-09 14:39:29

    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子句后只允许出现分组字段和统计函数,二其他任何字段都是不允许出现的。

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

  • qq_亘古疑云_0
    2017-06-29 15:15:29

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

  • 慕盖茨0528033
    2017-06-13 22:29:14

    暖一下回复,也是小白