2009-07-22 9 views
2

特定のレコードに対してSELECTを実行するときにWHERE句の順序を維持することは可能ですか?例えばWHERE SQLでの順序選択を維持する

、次のSELECT文与えられた:私は、結果として戻ってきたいと思い

SELECT [RecSeq] FROM [MyData] WHERE 
[RecSeq]=3 OR [RecSeq]=2 OR [RecSeq]=1 OR [RecSeq]=21 OR [RecSeq]=20 OR 
[RecSeq]=19 OR [RecSeq]=110 OR [RecSeq]=109 OR [RecSeq]=108 OR 
[RecSeq]=53 OR [RecSeq]=52 OR [RecSeq]=51; 

を:

3 
2 
1 
21 
20 
19 
110 
109 
108 
53 
53 
51 

しかし、私が戻って取得することは、特定のではありません注文。現在、私は必要な各レコードのSELECTステートメントを呼び出すループを持っています。これは、1〜70万倍の範囲である可能性があります。言うまでもなく、パフォーマンスは最高ではありません。

解決策はありますか、ループにはまっていますか?

+0

のように並べ替えをフィルタリングする派生テーブルを使用することができ、そのOR配列はまた、INを使用して書き込むことができます。 –

+0

クライアントが処理する必要がある注文を知っている場合。より小さい結果セットを扱っていたなら、順序を戻さずにクライアントにバッファリングさせ、クライアントは結果セット内でサーバーを結びつけずに望む順番に移動できるようにします。しかし、70万行が返されると、それはおそらく行く方法ではありません。また、どのDBMSを使用していますか? –

答えて

5

ORDER BY FIELD句が必要です。

SELECT RecSeq From MyData WHERE RecSeq IN (3, 2, 1, 21, 20, 19, 110, 109, 108, 53, 52, 51) 
ORDER BY FIELD (RecSeq, 3, 2, 1, 21, 20, 19, 110, 109, 108, 53, 52, 51); 

あなたはどのデータベースシステムを使用しているのかわかりません - 私はこれがMySQLで動作することを知っています。

+0

SQlサーバーでは動作しませんが、少年はそれが欲しかったです。ニースの解決策。 – HLGEM

1

WHERE節で出力順序を指定できません。

「注文者」を使用して結果を並べ替える必要があります。

この順序が絶対に必要な場合は、「擬似列」を試してください。

select 0 as my_fake_column, blah_columns from table where recseq = 3 
UNION 
select 1, blah_columns from table where recseq = 2 
UNION 
select 2, blah_columns from table where recseq = 1 
UNION 
select 3, blah_columns from table where recseq = 21 
order by my_fake_column 

上記の結果は、特定の順序3,2,1,21で返されます。

他のポスターは言ったように、列を追加することはオプションになる可能性があります。

4

SQLステートメントの結果の順序付けを確実に実行するには、正確に1つの方法があります。order by句を使用します。それは、標準SQLである場合、私は知りませんが、Oracleでは、あなたはこのような何かを行うことができます:

select ... from ... 
where recseq in (3, 2, 1, 21, 20, 19, 110, 109, 108, 53, 53, 51) 
order by decode(recseq 3,1, 2,2, 1,3, 21,4, 20,5, 19,6, 110,7, 109,8, 108,9, 53,10, 53,11, 51,12,13) 
+0

+1。私はこれが好き。 – blispr

+1

これはOracle固有のものです。 – HLGEM

1

雅いくつかは、それハック検討するかもしれない、けれども方法があります。また、私は、巨大な条件文の代わりにIN関数を使用することができます/使用する必要があることを指摘したいと思います。

SELECT [RecSeq] 
    FROM [MyData] 
WHERE [RecSeq] in (3,2,1,21,20,19,110,109,108,53,52,51) 
ORDER BY DECODE (recseq 3,1, 2,2, 1,3, 21,4,......) 
0

UNIONを使用できます。以下のような何か:

SELECT [RecSeq], 1 FROM [MyData] WHERE [RecSeq]=3 
UNION 
SELECT [RecSeq], 2 FROM [MyData] WHERE [RecSeq]=2 
UNION 
SELECT [RecSeq], 3 FROM [MyData] WHERE [RecSeq]=1 
*etc...* 
ORDER BY 2 
1

あなたはあなたのクエリにつきましては、この

SELECT t.RecSeq 
FROM MyData t 
JOIN (
     SELECT 3, 1 UNION ALL 
     SELECT 2, 2 UNION ALL 
     SELECT 1, 3 UNION ALL 
     SELECT 21, 4 UNION ALL 
     SELECT 20, 5 UNION ALL 
     SELECT 19, 6 
     ... 
     ) f(RecSeq, SortKey) 
ON  t.RecSeq = f.RecSeq 
ORDER BY f.SortKey 
+0

これはSQL Serverで動作し、非常に賢いです。 MyDataが巨大なテーブルで、派生テーブルのパフォーマンスのためにrecseqとsortkeyのインデックスを作成できるようにする必要がある場合は、常に派生テーブルを一時テーブルにすることができます。 – HLGEM

関連する問題