web-dev-qa-db-ja.com

SQL Server:存在する場合ELSE

私はtableAを持っています:

ID value
 1  100
 2  101
 2  444
 3  501

またTableB

ID Code
1
2

TableAにID = 2が存在する場合、テーブルBのcol = codeを追加します。複数の値の場合は、最大値を取得してください。それ以外の場合は「123」を入力します。今ここに私が使用したものがあります:

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

BEGIN; ENDまたはIF EXIST; ELSEに問題があると確信しています。基本的に、IF部分にselect文が存在する場合はelse部分をバイパスしたい、その逆の場合も同様です。たとえば、IF = partのselect文が

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

それはちょうど123、人口ID = 4が存在しないことを移植する必要があります!

56
Bhupinder Singh

EDIT

IFステートメントが機能しないように見える理由を付け加えたいと思います。集約に対してEXISTSを実行すると、常にtrueになります。 IDが存在しなくても値を返します。確かに、それはNULLですが、それを返します。代わりに、これをしてください:

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

ELSEステートメントのIF部分に移動します。


今、これはより良い、セットベースの解決策です:

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ではなくテーブル全体で実行できるという利点があります。

84
Derek Kromm

これを試して:

Update TableB Set
  Code = Coalesce(
    (Select Max(Value)
    From TableA 
    Where Id = b.Id), 123)
From TableB b
6
Charles Bretana