2011-09-22 3 views
0

私はパフォーマンス上の理由からカーソルを使用しません。ストアドプロシージャの 入力パラメータ:ARG1、ARG2、ARG3 & ARG4 例えば: 表A> A1列とA2列、 表B> B1カラム(A.A1 < => B.B1)外国のN主キー関連B2カラム。テーブルレコードをループしていくつかのロジックをチェックしてレコードのリストを更新するSQLクエリ?

私は

if(arg1 == B.B2 && arg2 == B.B2) 
{ 
    Update A set A.A2 = 1 where A.A1 = arg4 
} 
else{ 
if(arg1 == 1 && arg3 == B.B2){ 
Update A set A.A2 = 0 where A.A1 = arg4 
} 

} 

、これは一つのレコードのためのシンプルであるが、表Aは、私がする必要があるので、A.A1 = ARG4に合わせ1000年の記録を持っている、条件ならば、次に基づいてA.A2値を更新したいですすべてのレコードに上記のロジックまたはケースを適用し、カーソルの使用を避けたい...私はどのようにそれを行うのですか?

+0

どのRDBMSを使用していますか?また、プログラミング言語も使用しています(例は標準SQL形式ではないと考えている)。 – Wil

+0

B1はBの主キーですか? – Neil

答えて

1

次のクエリを試してください。

UPDATE tmp 
SET tmp.A2 = 
    (CASE WHEN (tmp1.B2 == arg1 && tmp1.B2 == arg2) THEN 1 WHEN (arg1 == 1 && tmp1.B2 == arg3) THEN 0 ELSE tmp.A2) 
FROM 
    A tmp 
INNER JOIN 
    B tmp1 
     ON tmp.A1 = tmp1.B1 
WHERE 
     tmp.A1 = arg4 

希望がこれです!

あなたがこれを行うことが一般的な、非特異的なSQL-92で
+0

これは、arg1 = 1とB.B2 = arg3の場合を完全に欠いています。 – Wil

+0

編集したクエリを今すぐ確認してください。 – Praveen

+0

@Praveenありがとう – DotNetDeveloper

1

UPDATE A 
SET A.A2 = CASE WHEN B.B2 IN (@Arg1,@Arg2) THEN 1 
      WHEN @arg1 = 1 AND B.B2 = @arg3 THEN 0 END 
FROM A 
JOIN B ON A.A1=B.B1 
WHERE A.A1 = @arg4 

あなたが任意の値は、それがAを設定しますELSEなし(通って落ちるたくない場合はENDELSEが必要な場合があります.A2~NULL)。

関連する問題