2016-06-27 7 views
0

私は現在、文字コード( 'AAA'や 'XYZ'など)に基づいてテーブルを返すストアドプロシージャを作成しています。各行には文字コードがあり、それらはすべて同じ列の 'コード'の一部です。ここでは私が探しているアルゴリズムの一種です:SQL - 同じ列の他の値の存在に応じて、テーブル内の変数を値に設定する最も効率的な方法は?

If 'XXX' exists in the table, @variable = 'XXX' --(XXX trumps all other codes) 
Else if 'YYY' exists in the table, @variable = 'YYY' --(If there's no XXX, pick YYY) 
(list continues on...) 
Else, @variable = '' 

これは技術的に困難ではありませんが、私のようなものを使用することを躊躇:それは食べるのと同じようクエリが見えますので、

SET @variable = CASE WHEN (SELECT TOP 1 Code FROM dbo.Table WHERE Code = 'XXX') THEN 'XXX' 
        WHEN (SELECT TOP 1 Code FROM dbo.Table WHERE Code = 'YYY') THEN 'YYY' 
       etc... 

をより低い優先度のコードに対しては本当に速いリソースが必要です。

良い方法がありますか?この形式の

+0

サンプルデータと希望の結果を追加できますか?いくつかの種類の表を返すと言いますが、サンプルコードは変数を設定するだけです。 –

+0

ああ、私はこれを文脈として使って、これが大きな手続きのほんの一部であることを説明しました。このサブセクションでは、実際に変数を設定しています。変数は、他のストアドプロシージャに渡されてデータなどを取得し、最終的にテーブルが生成されます。これは、この大規模な手順の最初のステップのほんの1つです。 – RBeaulieu

+0

'CODE'と' PRIORITY'カラムを使って "PRIORITY"の値を得るための "code"テーブルを作るのはどうですか?それはSQLをもっときれいにするでしょう。 –

答えて

0

コード:

SET @variable = (CASE WHEN EXISTS (SELECT TOP 1 Code FROM dbo.Table WHERE Code = 'XXX') THEN 'XXX' 
         WHEN EXISTS (SELECT TOP 1 Code FROM dbo.Table WHERE Code = 'YYY') THEN 'YYY' 
         . . . . 
       END); 

あなたはdbo.Table(code)にインデックスを持っていると仮定すると、問題ないはずです。

+0

実際には、(他のいくつかの列と共に)コードを含む列に一意のノンクラスタード・インデックスがあります。それでいい? – RBeaulieu

+0

@RBeaulieu。 。 。私はそう思う。それぞれは非常に速くなければならないインデックスルックアップです。 –

関連する問題