2011-09-15 11 views
40

Tengo un tablaA:Servidor SQL: SI EXISTE; ELSE

ID value 
1 100 
2 101 
2 444 
3 501 

también TableB

ID Code 
1 
2 

Ahora quiero llenar col = código de la tabla B si existe ID = 2 en tablaA. para valores múltiples, obtenga el valor máximo. lo completan con '123'. Ahora aquí es lo que solía:

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 

Estoy seguro de que hay algún problema en COMENZAR; END o en caso de que existan; ELSE. Básicamente quiero omitir la parte else si existe una instrucción select en IF-part y viceversa. Por ejemplo, si instrucción de selección de SI = parte es:

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

Debe simplemente llenar 123, coz ID = 4 no existen! Por favor, educa! Gracias de antemano

Respuesta

65

EDITAR

Quiero añadir la razón de que su estado de cuenta IF parece no funcionar. Cuando hace un EXISTS en un agregado, siempre va a ser true. Devuelve un valor incluso si el ID no existe. Claro, es NULL, pero lo está devolviendo. En su lugar, hacer esto:

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

y obtendrá a la parte ELSE de su declaración IF.


Ahora, aquí es una solución mejor a base de establecer:

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 

Esto tiene la ventaja de ser capaz de funcionar en toda la tabla en lugar de los identificadores individuales.

5

Prueba esto:

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