2011-09-15 15 views
40

Ho un tableA:SQL Server: IF EXISTS; ELSE

ID value 
1 100 
2 101 
2 444 
3 501 

anche TableB

ID Code 
1 
2 

Ora voglio riempire col = codice della tabella B se esiste ID = 2 in tableA. per più valori, ottieni il valore massimo. altrimenti lo popola con "123". Ora qui è quello che ho usato:

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 

Sono sicuro che c'è qualche problema in BEGIN, END o se sono presenti; ELSE. Fondamentalmente voglio bypassare la parte else se l'istruzione select nella parte IF esiste e viceversa. Per esempio, se select di IF = parte è:

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

Si deve solo compilare 123, coz ID = 4 non esistono! Per favore educa! Grazie in anticipo

risposta

65

EDIT

voglio aggiungere la ragione che la sua dichiarazione IF sembra non funzionare. Quando fai un EXISTS su un aggregato, sarà sempre true. Restituisce un valore anche se lo ID non esiste. Certo, è NULL, ma è il suo ritorno. Invece, fare questo:

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

e si otterrà al ELSE parte del vostro IF dichiarazione.


Ora, ecco una migliore, soluzione basata su set:

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 

Questo ha il vantaggio di essere in grado di girare su tutto il tavolo piuttosto che i singoli ID.

5

Prova questo:

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