2016-10-11 15 views
1

私はこのように構成されているテーブルを持っている:SQL値を選択

|ROWID |COUNTRY|PRICE| 
|1  |US  |15| 
|1  |UK  |10| 
|1  |EU  |12| 

私は、ストアドプロシージャ全体で使用するための変数に複数の行から値を選択する必要があり、

DECLARE @USprice int,@UKprice int 
SELECT @USprice = T.Price FROM Table T WHERE T.Country = 'US' 
SELECT @UKprice = T.Price FROM Table T WHERE T.Country = 'UK' 

この選択を実行する最も早い方法は何ですか?実際には、約12行を取得する必要がありますので、パフォーマンスに懸念があります。

これを行う方が良いでしょう:私はここに

効率的ではない変数ごとに個別のテーブルヒットを必要とする最初のアプローチで行くことはありません

DECLARE @USprice int,@UKprice int 
SELECT @USprice = CASE WHEN T.Country = 'US' THEN T.Price ELSE @USprice END 
,@UKprice = CASE WHEN T.Country = 'UK' THEN T.Price ELSE @UKprice END 
FROM Table T WHERE T.Country IN ('US','UK') 
+0

に複製されません考えると? (そのコードはANSI SQLのようには見えません) – jarlh

+0

T-SQL(MS-SQL-Server)のように見えます – MatBailie

+0

どちらの方法も使えますが、価格が複数返った場合は、変数に最後の値を代入します変数を代入するのではなく、このテーブルに加わることができます。 – TheGameiswar

答えて

2

は、達成するための正しい方法でありますの2番目のアプローチを使用している目標caseステートメントの上にMin/Max集約を追加する必要があります。

DECLARE @USprice INT, 
     @UKprice INT 
SELECT @USprice = Max(CASE WHEN T.Country = 'US' THEN T.Price ELSE NULL END), 
     @UKprice = Max(CASE WHEN T.Country = 'UK' THEN T.Price ELSE NULL END) 
FROM Table T 
WHERE T.Country IN ('US', 'UK') 

T.Country列がDBMSは、使用している

+0

OPの利点については、 'ELSE'をそこに置かないと*暗黙の*' ELSE NULL'が生成されます。そして、 'NULL'は' MAX() 'の中で常に「最後」と扱われます。 – MatBailie

+0

@MatBailie - ソリューションに追加 –