2011-09-15 8 views
40

は私がにtableA持っている:SQL Server:IF存在。 ELSE

ID value 
1 100 
2 101 
2 444 
3 501 

またTableBの

ID Code 
1 
2 

を今私はID = 2がにtableAに存在する場合、テーブルBのCOL =コードを移入します。複数の値の場合、最大値を取得します。 それ以外の場合は、 '123'を入力します。さて、ここで私が使用したものである:私はBEGINでいくつかの問題があると確信しています

if exists (select MAX(value) from #A where id = 2) 
BEGIN 
update #B 
set code = (select MAX(value) from #A where id = 2) 
from #A 
END 

ELSE 

update #B 
set code = 123 
from #B 

; ENDまたはIFに存在し; ELSE。 基本的には、IF部分のselect文が存在すればelse部分をバイパスしたいと思います。例えばIF =一部のselect文がある場合:

(select MAX(value) from #A where id = 4) 

それはちょうど123を投入する必要があり、だってのID = 4は存在しません!教えてください!アドバンス

答えて

65

EDIT

で おかげで私はあなたのIF文が動作しないように思われる理由を追加します。集計でEXISTSを実行すると、常にtrueになります。 IDが存在しない場合でも値を返します。確かに、それはNULLですが、それを返します。代わりに、この操作を行います。

if exists(select 1 from table where id = 4) 

を、あなたはあなたのIF文のELSE部分に取得します。

update b 
    set code = isnull(a.value, 123) 
from #b b 
left join (select id, max(value) from #a group by id) a 
    on b.id = a.id 
where 
    b.id = yourid 

これは、テーブル全体ではなく、個別のID上で実行することができるという利点を有する:


は今、ここではより良い、セットベースのソリューションです。

5

これを試してみてください:

Update TableB Set 
    Code = Coalesce(
    (Select Max(Value) 
    From TableA 
    Where Id = b.Id), 123) 
From TableB b 
関連する問題