2011-08-10 190 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