SQL Server: ЕСЛИ СУЩЕСТВУЕТ; ELSE - PullRequest
56 голосов
/ 15 сентября 2011

У меня есть таблица A:

ID value
 1  100
 2  101
 2  444
 3  501

Также TableB

ID Code
1
2

Теперь я хочу заполнить col = код таблицы B, если существует идентификатор ID = 2 в таблице A. для нескольких значений получите максимальное значение. иначе заполните его '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 По сути, я хочу обойти часть else, если оператор select в IF-части существует, и наоборот. Например, если оператор выбора IF = part:

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

Он должен просто заполнить 123, потому что ID = 4 не существует!

Ответы [ 2 ]

84 голосов
/ 15 сентября 2011

РЕДАКТИРОВАТЬ

Я хочу добавить причину, по которой ваше утверждение 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

Преимущество заключается в возможности запуска по всей таблице, а не по отдельным идентификаторам.

6 голосов
/ 15 сентября 2011

Попробуйте это:

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