關于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中要達到同樣的效果,該怎么辦,求大神指導!!
2017-06-14
暫時沒有想到什么好辦法,oracle中select的字段去除聚合函數中使用的,其他字段都要出現在group by中,這就有點坑了。。
2017-07-09
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子句后只允許出現分組字段和統計函數,二其他任何字段都是不允許出現的。
好的,希望能對你有幫助。謝謝!
2017-06-29
select * from users t where t.id in (select a.id from users a group by a.id having count(a.username)<2),看下這樣符合你的要求不
2017-06-13
暖一下回復,也是小白