2011-08-10 14 views
0

テーブルからデータを取得しています。私のクエリはこれがあまりにも彼らが入ってきた順に重複ENAMEを返してこのSQLクエリの問題

select ename from emp where job="clerk" 

のようなものであると仮定します。

私は重複values.ButのENAMEは、アルファベット順の昇順に来ているを避けるためにこれをしなかった

select distinct ename from emp where job="clerk" 

にこれを修正しました。しかし、私はそれが別個のものを使わずに来ていたときにデータを入力した順番でこれを望みます。

+0

を?たとえば、Oracleでは、DISTINCTを使用するだけで自動的にアルファベット順に昇順に並べ替えられません。 – beny23

+0

私はsqliteを使用しています –

答えて

3

SQLテーブル内のデータには、固有の順序はありません。注文が必要な場合は、ORDER BYを使用して注文を指定する必要があります。 DISTINCTを使用している場合は、選択した列でのみ注文できます。

あなたがPKを持っている場合、これは近似のようになります。

あなたはORDER BYを指定しない限り、ありますanswer古いから

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

(私はこれが役立つことを知っていました) が最初に返される行についての保証はありません。

実際には、注文は通常クラスタ化インデックス と一致し、呼び出しごとに変化しません。この動作に頼らないでください。

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を使用しない場合はyesです。 distinctを使用する場合は、選択しなかった列でどのように注文したいですか?同一の別個の値に対して、複数の「値による順序付け」が存在する可能性があります。 – Jacob

+0

申し訳ありません私はsqliteを使用していて、私は別名を使用しているときには、Aが最初に来ることをenameのようなアルファベット順に来ていると忘れてしまった。私はどんな順序もしたくない。私はそれらがデータベースに存在する順序でデータを望む。 –

1

あなたのテーブルがAUTO_INCREMENTキー(id)を持っている場合は、この試すことができます:DBは、使用している

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