web-dev-qa-db-fra.com

SQL Server: IF EXISTS; AUTRE

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 la tableA. pour plusieurs valeurs, obtenez la valeur maximale. sinon le peupler 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 la partie else si l'instruction select de la partie IF existe et inversement. Par exemple, si l'instruction select de IF = part est:

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

Il devrait juste remplir 123, car coz = 4 n'existent pas!

57
Bhupinder Singh

EDIT

Je veux ajouter la raison pour laquelle votre déclaration IF ne semble pas fonctionner. Lorsque vous faites un EXISTS sur un agrégat, il s'agira toujours de true. Il retourne une valeur même si la ID n'existe pas. Bien sûr, c’est NULL, mais le retourne. Au lieu de cela, faites ceci:

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

et vous obtiendrez 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

Cela présente l'avantage de pouvoir fonctionner sur la table entière plutôt que sur des identifiants individuels.

87
Derek Kromm

Essaye ça:

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