2011-09-15 137 views
40

我有一個表A:SQL Server:IF EXISTS; ELSE

ID value 
1 100 
2 101 
2 444 
3 501 

另外TABLEB

ID Code 
1 
2 

現在我想,如果有在表A中存在ID = 2來填充表B的欄=代碼。對於多個值,獲得最大值。 否則用'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;結束或在IF EXIST; ELSE有一些問題。 基本上我想繞過else部分,如果IF部分中的select語句存在,反之亦然。例如,如果IF = part的select語句是:

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

它應該只填充123,因爲ID = 4不存在!請教育! 由於提前

回答

65

編輯

我想補充一點,你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