SQL Server: si existe; sinon

J'ai une tableA:

ID value
 1  100
 2  101
 2  444
 3  501

Aussi TableB

ID Code
1
2

Maintenant, je veux remplir col = code de la table B s'il existe ID = 2 dans tableA. pour plusieurs valeurs , obtenez la valeur max. sinon, remplissez-le avec '123'. Maintenant, voici ce que j'ai utilisé:

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

Je suis sûr qu'il y a un problème dans BEGIN; END ou dans if EXIST; ELSE. Fondamentalement, je veux contourner l'instruction else part if select dans IF-part exist et vice-versa. Par exemple, l'instruction if select De IF = part est:

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

, Il devrait juste remplir 123, coz ID = 4 n'existent pas ! Nous vous invitons à sensibiliser ! Merci d'avance

48
demandé sur Bhupinder Singh 2011-09-15 06:16:29

2 réponses

Modifier

Je veux ajouter la raison pour laquelle votre instruction IF semble ne pas fonctionner. Lorsque vous faites un EXISTS sur un ensemble, il va toujours être true. Il renvoie une valeur même si le ID n'existe pas. Bien sûr, c'est NULL, mais c'est le retourner. Au lieu de cela, faites ceci:

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

Et vous arriverez à la partie ELSE de votre déclaration IF.


Maintenant, voici une meilleure solution basée sur les ensembles:

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

Ceci a l'avantage de pouvoir fonctionner sur le table entière plutôt que des identifiants individuels.

73
répondu Derek Kromm 2015-03-09 13:46:16

Essayez ceci:

Update TableB Set
  Code = Coalesce(
    (Select Max(Value)
    From TableA 
    Where Id = b.Id), 123)
From TableB b
6
répondu Charles Bretana 2016-01-08 08:57:48