2011-09-15 22 views
40

Mam TABLEA:Serwer SQL: IF EXISTS; ELSE

ID value 
1 100 
2 101 
2 444 
3 501 

TableB także

ID Code 
1 
2 

Teraz chcę wypełnić col = kod tabeli B, jeżeli istnieje id = 2 w TABLEA. dla wielu wartości, uzyskaj maksymalną wartość. jeszcze zapełnij go "123". Teraz tutaj jest to, co kiedyś:

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 

Jestem pewien, że jest jakiś problem w BEGIN, END lub w przypadku istnienia; indziej. Zasadniczo chcę pominąć część else, jeśli instrukcja select w IF-part istnieje i vice versa. Na przykład, jeśli instrukcja select IF = part jest:

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

Powinno to być po prostu wypełnianie 123, nie jest równy identyfikator ID 4! Proszę kształcić! Dzięki z góry

Odpowiedz

65

EDIT

chcę dodać powód, że oświadczenie IF wydaje się nie działać. Gdy wykonasz agregację EXISTS, zawsze będzie to true. Zwraca wartość, nawet jeśli ID nie istnieje. Pewnie, to jest NULL, ale powraca. Zamiast to zrobić:

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

a dostaniesz się do części ELSE z wyciągu IF.


Teraz tutaj jest lepiej ustawiony rozwiązanie oparte na:

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 

Ma to tę zaletę, że są w stanie uruchomić na całym stole zamiast indywidualnych identyfikatorów.

5

Spróbuj tego:

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