2011-08-10 185 views
0

我正在從表中提取一些數據。假設我的查詢是這樣SQL查詢問題

select ename from emp where job="clerk" 

這是返回重複的ename太多,但要想在他們進入。

我修改這

select distinct ename from emp where job="clerk" 

我這樣做是爲了避免重複values.But的ename按字母順序升序來了。但我希望按照我輸入數據的順序進行操作,因爲它是在不使用不同的情況下進行的。

+0

哪個DB您使用的?例如,在Oracle中,訂單不是僅通過使用DISTINCT按字母順序升序。 – beny23

+0

我正在使用sqlite –

回答

3

SQL表中的數據沒有固有順序。如果您需要訂單,則必須使用ORDER BY進行指定。如果您使用DISTINCT,則只能按您選擇的列進行排序!

如果你有一個PK,這將是一個近似值:

select distinct id,ename from emp where job="clerk" order by id desc 

從舊answer(我知道這將是有益的):

除非指定ORDER BY,有不保證首先返回哪些行 。

但實際上,訂單通常會與訂單聚集索引 相匹配,並且在調用之間不會改變。不要依賴這種行爲。

Does MySQL's LIMIT keyword guarantee order of returned data?

沒有默認的排序順序。即使表中有一個聚集的 索引,也不保證按該順序得到結果。如果您需要特定訂單,您必須使用order by子句 。

SQL best practice to deal with default sort order

....

+0

您可以通過表格上的任意列進行排序,它不必位於您的select子句中 – iamkrillin

+0

如果您不使用DISTINCT,那麼可以。如果你使用不同的,你想如何通過你沒有包括在你的選擇中的列來訂購?對於相同的不同值,可能有多個「按價值排序」。 – Jacob

+0

抱歉,我忘記說我正在使用sqlite,當我使用不同的時候,它會按字母順序升序排列,比如ename,A先來,B來第二,等等。我不想要任何訂單。我希望數據按照它們在數據庫中的存在順序排列。 –

1

如果您的表已經AUTO_INCREMENT鍵(id),你可以試試這個:

SELECT ename FROM emp WHERE job="clerk" GROUP BY ename ORDER BY id